home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / DOCS / NVDIGUID / NVDIGUID.TXT
Encoding:
Text File  |  1995-01-28  |  195.4 KB  |  5,544 lines

  1. NVDI 3 Programmer's Guide
  2. =========================
  3.  
  4. Stand: 22.1.95 (vorläufige Fassung)
  5.  
  6. (c) 1995 by Wilfried Behne
  7.  
  8. Intentionen, Konditionen, Ovationen
  9. -----------------------------------
  10.  
  11. "Neue Version - neue Fragen" - mit dem Erscheinen von NVDI 3 ist die
  12. Anzahl der Anfragen zu NVDI bei mir rapide gestiegen. Zum Teil waren es
  13. NVDI-Besitzer, die an weitergehenden Informationen interessiert waren, zum
  14. Teil aber auch Programmierer, die NVDI nicht besitzen und ihre Programme
  15. an NVDI anpassen wollten.
  16.  
  17. Diese vorläufige Funktionsbeschreibung zu NVDI 3 ist ist in die Teile
  18.  
  19. -  Datentypen und Strukturen
  20. -  Versionsabfragen
  21. -  Funktionsumfang
  22. -  Gerätetreiber und Offscreen-Bitmaps
  23. -  Farbeinstellungen
  24. -  Verknüpfung und Zeichenbereich
  25. -  Linien und nicht gefüllte Grafikprimitive
  26. -  Gefüllte Grafikprimitive
  27. -  Marker
  28. -  Textausgaben mit Bitmap- und Vektorfonts
  29. -  Rasterfunktionen
  30. -  Eingabefunktionen
  31. -  Textmodus und VT52
  32. -  Beispiele für Bindings
  33.  
  34. gegliedert. Für die Vollständigkeit und Richtigkeit der gemachten Angaben wird
  35. keinerlei Gewähr übernommen.
  36.  
  37. Konditionen
  38. -----------
  39.  
  40. Diese Dokumentation ist Public Domain, d.h. sie darf frei kopiert und benutzt
  41. werden. Der entgeldliche Vertrieb ist untersagt. Zuwiderhandlungen werden
  42. strafrechtlich verfolgt.
  43.  
  44. Zu NVDIGUID.LZH gehören folgende Dateien:
  45.  
  46.    - NVDIGUID.TXT
  47.  
  48.    (to be continued ...)
  49.  
  50. Das Archiv darf nur komplett mit diesen Dateien weitergegeben werden!
  51. Es ist erlaubt, die Dateien für die eigenen Anforderungen zu verändern. Es ist
  52. jedoch NICHT erlaubt, diese veränderten Dateien weiterzugeben.
  53.  
  54. Für Wünsche, Anregungen und Fehlerkorrekturen habe ich natürlich immer ein
  55. offenes Ohr ( wilfried_behne@maush.han.de ).
  56.  
  57. Disclaimer
  58. ----------
  59. Speedo ist ein eingetragenes Warenzeichen von Bitstream Inc., TrueType und
  60. TrueType GX sind eingetragene Warenzeichen von Apple Computer, Inc, PostScript
  61. ist ein eingetragenes Warenzeichen von Adobe Systems Inc. Die meisten hier
  62. erwähnten Produkte sind in der Regel durch Warenzeichen geschützt. Das Fehlen
  63. gesonderter Hinweise bedeutet nicht, da₧ diese Produkte frei von Rechten Dritter
  64. sind.
  65.  
  66.  
  67.  
  68.  
  69. Datentypen und Strukturen
  70. =========================
  71.  
  72. ∙ Benutzte Datentypen
  73.  
  74. Die Deklarationen und Beschreibungen arbeiten mit den folgenden Datentypen:
  75.  
  76. BYTE     8 Bit, vorzeichenbehaftet, -128 bis 127
  77. UBYTE    8 Bit, kein Vorzeichen, 0 bis 255
  78. WORD     16 Bit, vorzeichenbehaftet, -32768 bis 32767
  79. UWORD    16 Bit, kein Vorzeichen, 0 bis 65535
  80. LONG     32 Bit, vorzeichenbehaftet, -2147483648 bis 2147483647
  81. ULONG    32 Bit, kein Vorzeichen, 0 bis 4294967295
  82. fix31    32 Bit, vorzeichenbehaftet, -2147483648 bis 2147483647
  83.  
  84. BYTE wird normalerweise in den C-Bindings für die Übergabe von Zeichenketten
  85. benutzt. Für die meisten VDI-Funktionen werden die BYTE-Werte erweitert (und
  86. zwar so, als ob sie vorzeichenlos wären), da z.B. der Index eines Zeichens im
  87. Bereich 0-65535 liegen kann.
  88.  
  89. Der Standard-Typ des VDIs ist WORD. Die Felder contrl, intin, ptsin, intout und
  90. ptsout sind als WORD deklariert. Die Interpretation der Werte hängt aber vom
  91. jeweiliegen VDI-Aufruf ab. Koordinaten in ptsin werden als vorzeichenbehaftet
  92. betrachtet (-32768 bis +32768), Werte in intin oftmals als vorzeichenlos.
  93.  
  94. Der Typ fix31 wird im Zusammenhang mit Vektorfonts gebraucht, wo mit Positonen
  95. und Schrittweiten in 1/65536 gerechnet wird (1 Pixel Weite entspricht 65536).
  96. Die oberen 16 Bit repräsentieren den Vorkommaanteil und die unteren 16 Bit die
  97. Nachkommastellen. Beispiele:
  98.  
  99. hex.        dez.
  100. $00010000   65536    1.0 Pixel
  101. $0001c000  114688    1.75 Pixel
  102. $fffec000  -81920   -1.25 Pixel
  103. $fffe4000 -114688   -1.75 Pixel
  104.  
  105. Wer Schrittbreiten (beispielsweise von vqt_advance()) aufsummiert und
  106. anschlie₧end die Pixelposition für Cursorpositionierung berechnen möchte sollte
  107. wie folgt vorgehen:
  108.  
  109. WORD  fix31_to_pixel( fix31 a )
  110. {
  111.    WORD  b;
  112.  
  113.    b = (WORD) (( a + 32768L ) >> 16 ); /* runden !! */
  114.    return( b );                        /* Pixelwert zurückgeben */
  115. }
  116.  
  117. Man darf nie, nie, niemals den Nachkommateil einfach abschneiden!
  118.  
  119.  
  120. ∙ Strukturen und Felder für VDI-Aufrufe
  121.  
  122. Die folgenden Felder und Strukturen werden für VDI-Aufrufe benötigt:
  123.  
  124. WORD  contrl[12];
  125.  
  126. In contrl werden die Funktionsnummer, die Anzahl der Eingaben, das Handle der
  127. Workstation und einige Funktionsabhängige Paramter übergeben. Die Eingaben
  128. werden grundsätzlich wie folgt eingetragen:
  129.  
  130. contrl[0]:     Funktionsnummer
  131. contrl[1]:     Anzahl der Eingabe-Koordinatenpaare (in ptsin)
  132. contrl[3]:     Anzahl der Eingabe-Integers (in intin)
  133. contrl[5]:     Unterfunktionsnummer
  134. contrl[6]:     Workstation-Handle
  135. contrl[7..n]:  abhängig von der Funktion
  136.  
  137. Die Ausgaben werden in den folgenden Elementen zurückgegeben:
  138.  
  139. contrl[2]:     Anzahl der Ausgabekoordinatenpaare (in ptsout)
  140. contrl[4]:     Anzahl der Ausgabe-Integers (in intout)
  141. contrl[6]:     Workstation-Handle (nur bei v_opnwk()/v_opnvwk()/v_opnbm())
  142.  
  143. Die Felder ptsin und ptsout werden benutzt, um Koordinatenpaare oder Ma₧e in
  144. Pixeln (z.B. die Breite einer Linie oder die Höhe eines Zeichens) zu
  145. übergeben. Die Grö₧e der Felder hängt von den aufgerufenen Funktionen ab.
  146. Eine sinnvolle Deklaration könnte wie folgt aussehen:
  147.  
  148. WORD  ptsin[1024];   /* Platz für 512 Eingabe-Koordinatenpaare */
  149. WORD  ptsout[256];   /* Platz für 128 Ausgabe-Koordinatenpaare */
  150.  
  151. Worte wie der Index eines Zeichens oder der Index einer Farbe werden in intin
  152. und intout übergeben. Auch hier hängt letztendlich die Grö₧e der Felder von
  153. den aufgerufenen Funktionen ab. Eine sinnvolle Deklaration könnte wie folgt
  154. aussehen:
  155.  
  156. WORD  intin[1024];   /* Platz für 1024 Eingabe-Worte */
  157. WORD  intout[512];   /* Platz für 512 Ausgabe-Worte */
  158.  
  159. Um das VDI aufzurufen, mu₧ der folgende Paramterblock mit den Adressen der
  160. oben beschriebenen Felder bestückt werden. Die Adresse des Parameterblocks
  161. wird in Register d1 eingetragen und Register d0.w enthält 115. Anschlie₧end
  162. wird ein Systemaufruf mit dem Befehl trap #2 ausgelöst.
  163.  
  164. typedef struct
  165. {
  166.    WORD  *contrl;    /* Zeiger auf contrl */
  167.    WORD  *intin;     /* Zeiger auf intin */
  168.    WORD  *ptsin;     /* Zeiger auf ptsin */
  169.    WORD  *intout;    /* Zeiger auf intout */
  170.    WORD  *ptsout;    /* Zeiger auf ptsout */
  171. } VDIPB;
  172.  
  173. Farbeinstellungen:
  174.  
  175. Bei vs_color(), vq_color() und vs_calibrate() werden RGB-Intensitäten in
  176. Promille übergeben, wofür am zweckmä₧igsten die RGB-Struktur benutzt wird:
  177.  
  178. typedef struct
  179. {
  180.    WORD  red;        /* Rot-Intensität in Promille (0-1000) */
  181.    WORD  green;      /* Grün-Intensität in Promille (0-1000) */
  182.    WORD  blue;       /* Blau-Intensität in Promille (0-1000) */
  183. } RGB1000;
  184.  
  185. Rasterfunktionen:
  186.  
  187. VDI-Funktionen, die Raster verknüpfen, erwarten als Rasterbeschreibung einen
  188. oder mehrere sogenannte MFDBs, "Memory Form Definition Block".
  189.  
  190. typedef struct
  191. {
  192.    void  *fd_addr;   /* Adresse des Rasters oder 0 für Bildschirm/Bitmap */
  193.    WORD  fd_w;       /* Breite des Rasters in Pixeln */
  194.    WORD  fd_h;       /* Höhe des Rasters in Zeilen */
  195.    WORD  fd_wdwidth; /* Breite einer Rasterzeile in Worten */
  196.    WORD  fd_stand;   /* Format 0: gerätespezifisch, 1: Standardformat */
  197.    WORD  fd_nplanes; /* Anzahl der Ebenen */
  198.    WORD  fd_r1;      /* reserviert, sollte 0 sein */
  199.    WORD  fd_r2;      /* reserviert, sollte 0 sein */
  200.    WORD  fd_r3;      /* reserviert, sollte 0 sein */
  201. } MFDB;
  202.  
  203. Wenn fd_addr eine 0 enthält, mu₧ der Rest des MFDBs nicht ausgefüllt werden. Die
  204. Rasteroperationen vrt_cpyfm() und vro_cpyfm() beziehen sich dann automatisch auf
  205. den Bildschirm (oder im Fall eines Druckertreibers auf die Druckerbitmap). Die
  206. reservierten Worte fd_r1, fd_r2 und fd_r3 sollten hinsichtlich zukünftiger
  207. Erweiterungen auf 0 gesetzt werden!
  208.  
  209. Metafiles:
  210.  
  211. Metafiles beginnen mit dem folgenden Header:
  212.  
  213. typedef struct
  214. {
  215.    WORD  mf_header;     /* -1, Metafile-Kennung */
  216.    WORD  mf_length;     /* Länge des Headers in Worten (normalerweise 24) */
  217.    WORD  mf_version;    /* Versionsnummer des Formats, hier 101 für 1.01 */
  218.    WORD  mf_ndcrcfl;    /* NDC/RC-Flag, normalerweise 2 (Rasterkoordinaten) */
  219.    WORD  mf_extents[4]; /* optional - maximale Ausma₧e der Grafik */
  220.    WORD  mf_pagesz[2];  /* optional - Seitengrö₧e in 1/10 mm */
  221.    WORD  mf_coords[4];  /* optional - Koordinatensystem */
  222.    WORD  mf_imgflag;    /* Flag für durch v_bit_image() eingebundene IMGs */
  223.    WORD  mf_resvd[9];
  224. } METAHDR;
  225.  
  226. Die Angaben in mf_extents, mf_pagesz und mf_coords sind optional. Falls ein
  227. Programm sie nicht gesetzt hat, enthalten diese Felder Nullen. Das IMG-Flag
  228. zeigt an, ob Aufrufe von v_bit_image() im Metafile gespeichert sind.
  229.  
  230. Bei vqt_xfntinfo() wird die XFNT_INFO-Struktur benötigt, in oft benötigt Angaben
  231. über einen Font eingetragen werden:
  232.  
  233. typedef struct
  234. {
  235.    LONG  size;             /* Länge der Struktur, mu₧ vor vqt_xfntinfo() gesetzt werden */
  236.    WORD  format;           /* Fontformat, z.B. 4 für TrueType */
  237.    WORD  id;               /* Font-ID, z.B. 6059 */
  238.    WORD  index;            /* Index */
  239.    BYTE  font_name[50];    /* vollständiger Fontname, z.B. "Century 725 Italic BT" */
  240.    BYTE  family_name[50];  /* Name der Fontfamilie, z.B. "Century725 BT" */
  241.    BYTE  style_name[50];   /* Name des Fontstils, z.B. "Italic" */
  242.    BYTE  file_name1[200];  /* Name der 1. Fontdatei, z.B. "C:\FONTS\TT1059M_.TTF" */
  243.    BYTE  file_name2[200];  /* Name der optionalen 2. Fontdatei */
  244.    BYTE  file_name3[200];  /* Name der optionalen 3. Fontdatei */
  245.    WORD  pt_cnt;           /* Anzahl der Punkthöhen für vst_point(), z.B. 10 */
  246.    WORD  pt_sizes[64];     /* verfügbare Punkthöhen,
  247.                               z.B. { 8, 9, 10, 11, 12, 14, 18, 24, 36, 48 } */
  248. } XFNT_INFO;
  249.  
  250.  
  251. ∙ Zeichenketten
  252.  
  253. Grundsätzlich werden Strings beim VDI in intin und intout übergeben, wobei pro
  254. Zeichen ein Wort benutzt wird. Diese Übergabe hat den Vorteil, da₧ auch andere
  255. Kodierungen als ASCII benutzbar sind und da₧ auch mehr als 256 Zeichen eines
  256. Fonts benutzt werden können.
  257.  
  258. Die C-Bindings für Funktionen wie v_ftext(),vqt_name(), vqt_extent() usw.
  259. arbeiten mit normalen C-Strings und wandeln sie fürs VDI um. Die Länge eines
  260. derartigen Strings wird dabei in contrl[3] bzw. contrl[4] eingetragen, wobei kein
  261. abschlie₧endes Null-Byte oder -Wort vorhanden ist!
  262. Wer z.B eine in intout ausgegebene  Zeichenkette in einen C-String wandeln
  263. möchte, mu₧ contrl[4]  Elemente kopieren, dabei die oberen 8 Bit abschneiden und
  264. anschlie₧end ein Null-Byte anhängen.
  265.  
  266. void  vdi_str_to_c( UWORD *src, UBYTE *des, WORD len )
  267. {
  268.    while ( len > 0 )
  269.    {
  270.       *des++ = (UBYTE) *src++;   /* nur das Low-Byte kopieren */
  271.       len--;
  272.    }
  273.    *des++ = 0;                   /* Ende des Strings */
  274. }
  275.  
  276. WORD c_str_to_vdi( UBYTE *src, UWORD *des )
  277. {
  278.    WORD  len;
  279.  
  280.    while (( *des++ = *src++ ) != 0 )
  281.       len++;
  282.  
  283.    return( len );                /* Länge des Strings ohne Null-Byte */
  284. }
  285.  
  286. Wenn es sich bei einem Funktionsparameter um einen C-String handelt, wird das in
  287. der Regel explizit erwähnt.
  288.  
  289.  
  290.  
  291.  
  292. Versionsabfragen
  293. ================
  294.  
  295. Um herauszufinden, welche NVDI-Version man vor sich hat und welchen
  296. Funktionsumfang sie hat, mu₧ der "NVDI"-Cookie gesucht werden, der die
  297. Versionsnummer im BCD-Format enthält (z.B. 0x0301 für Version 3.01).
  298.  
  299. Wer die Offscreen-Bitmaps nutzen möchte, sollte nach dem "EdDI"-Cookie suchen.
  300. Das auf die Kennung folgende Langwort ist die Adresse eines Dispatchers, der mit
  301. der Funktionsnummer in Register d0.w aufgerufen wird. Für den Aufruf gelten die
  302. Pure C-Konventionen, d.h. Register d0-d2/a0-a1 und der Stack werden zur
  303. Parameterübergabe benutzt, d0-d2/a0-a1 können verändert werden). Die Funktion 0
  304. liefert die EdDI-Versionsnummer im BDC-Format (0x0110 für Version 1.10).
  305.  
  306. typedef struct
  307. {
  308.   BYTE   id[4];         /* enthält hier 0x4e564449 = 'NVDI' */
  309.   LONG   value;         /* zeigt auf die NVDI-Struktur */
  310. } COOKIE;
  311.  
  312. typedef struct
  313. {
  314.    UWORD nvdi_version;  /*  z.B. 0x0301 für Version 3.01 */
  315.    ULONG nvdi_datum;    /*  z.B. 0x18061990L für 18.06.1990 */
  316. } NVDI_STRUC;
  317.  
  318.  
  319.  
  320.  
  321. Funktionsumfang
  322. ===============
  323.  
  324. Hier folgt eine kurze Auflistung der unterstützten Funktionen mit Angabe, ab
  325. welcher Version diese Funktion zur Verfügung steht.
  326.  
  327. contrl[0]   contrl[5]   Funktionsname           Verfügbarkeit
  328.  
  329. Treiber und Verwaltung:
  330.  
  331.    1           0        v_opnwk();
  332.    2           0        v_clswk();
  333.    100         0        v_opnvwk();
  334.    101         0        v_clsvwk();
  335.    3           0        v_clrwk();
  336.    4           0        v_updwk();
  337.    5           22       v_clear_disp_list();
  338.    100         1        v_opnbm();              ab EdDI 1.00
  339.    101         1        v_clsbm();              ab EdDI 1.00
  340.    102         0        vq_extnd();
  341.    102         1        vq_scrninfo();          ab EdDI 1.00
  342.    248         0        vq_devinfo();           ab NVDI 3.00
  343.    248         4242     vq_ext_devinfo();       ab NVDI 3.00
  344.  
  345. Farbeinstellungen:
  346.  
  347.    5           76       vs_calibrate();         je nach Treiber
  348.    5           77       vq_calibrate();         je nach Treiber
  349.    14          0        vs_color();
  350.    26          0        vq_color();
  351.  
  352. Verknüpfung und Zeichenbereich:
  353.  
  354.    32          0        vswr_mode();
  355.    129         0        vs_clip();
  356.  
  357. Linien und nicht gefüllte Grafikprimitive:
  358.  
  359.    5           99       v_bez_qual();           ab NVDI 2.10
  360.    6           0        v_pline();
  361.    6           13       v_bez();                ab NVDI 2.10
  362.    11          2        v_arc();
  363.    11          6        v_ellarc();
  364.    11          8        v_rbox();
  365.    11          13       v_bez_on();             ab NVDI 2.10
  366.    11          13       v_bez_off();            ab NVDI 2.10
  367.    15          0        vsl_type();
  368.    16          0        vsl_width();
  369.    17          0        vsl_color();
  370.    35          0        vql_attributes();
  371.    108         0        vsl_ends();
  372.    113         0        vsl_udsty();
  373.  
  374. Gefüllte Grafikprimitive:
  375.  
  376.    9           0        v_fillarea();
  377.    9           13       v_bez_fill();           ab NVDI 2.10
  378.    11          1        v_bar();
  379.    11          3        v_pieslice();
  380.    11          4        v_circle();
  381.    11          5        v_ellipse();
  382.    11          7        v_ellpie();
  383.    11          9        v_rfbox();
  384.    23          0        vsf_interior();
  385.    24          0        vsf_style();
  386.    25          0        vsf_color();
  387.    37          0        vqf_attributes();
  388.    103         0        v_contourfill();
  389.    104         0        vsf_perimeter();
  390.    112         0        vsf_udpat();
  391.    114         0        vr_recfl();
  392.  
  393. Marker:
  394.  
  395.    7           0        v_pmarker();
  396.    18          0        vsm_type();
  397.    19          0        vsm_height();
  398.    20          0        vsm_color();
  399.    36          0        vqm_attributes();
  400.  
  401. Textausgabe:
  402.  
  403.    8           0        v_gtext();
  404.    11          10       v_justified();
  405.    12          0        vst_height();
  406.    13          0        vst_rotation();
  407.    21          0        vst_font();
  408.    22          0        vst_color();
  409.    38          0        vqt_attributes();
  410.    39          0        vst_alignment();
  411.    106         0        vst_effects();
  412.    107         0        vst_point();
  413.    116         0        vqt_extent();
  414.    117         0        vqt_width();
  415.    119         0        vst_load_fonts();
  416.    120         0        vst_unload_fonts();
  417.    130         0        vqt_name();             ab NVDI 3.00 erweitert
  418.    131         0        vqt_fontinfo();
  419.    229         0        vqt_xfntinfo();         ab NVDI 3.02
  420.    230         0        vst_name();             ab NVDI 3.02
  421.    230         100      vqt_name_and_id();      ab NVDI 3.02
  422.    231         0        vst_width();            ab NVDI 3.00
  423.    232         0        vqt_fontheader();       ab NVDI 3.00
  424.    234         0        vqt_trackkern();        ab NVDI 3.00
  425.    235         0        vqt_pairkern();         ab NVDI 3.00
  426.    236         0        vst_charmap();          ab NVDI 3.00
  427.    237         0        vst_kern();             ab NVDI 3.00
  428.    237         0        vst_track_offset();     ab NVDI 3.00
  429.    239         0        v_getbitmap_info();     ab NVDI 3.00
  430.    240         0        vqt_f_extent();         ab NVDI 3.00
  431.    240         4200     vqt_real_extent()       ab NVDI 3.00
  432.    241         0        v_ftext();              ab NVDI 3.00
  433.    241         0        v_ftext_offset();       ab NVDI 3.00
  434.    243         0        v_getoutline();         ab NVDI 3.00
  435.    246         0        vst_arbpt();            ab NVDI 3.00
  436.    247         0        vqt_advance();          ab NVDI 3.00
  437.    252         0        vst_setsize();          ab NVDI 3.00
  438.    253         0        vst_skew();             ab NVDI 3.00
  439.  
  440. Rasterfunktionen:
  441.  
  442.    105         0        v_get_pixel();
  443.    109         0        vro_cpyfm();
  444.    110         0        vr_trnfm();
  445.    121         0        vrt_cpyfm();
  446.  
  447. Eingabefunktionen:
  448.  
  449.    33          0        vsin_mode();
  450.    28          0        vrq_locator();
  451.    28          0        vsm_locator();
  452.    30          0        vrq_choice();
  453.    30          0        vsm_choice();
  454.    31          0        vrq_string();
  455.    31          0        vsm_string();
  456.    111         0        vsc_form();
  457.    115         0        vqin_mode();
  458.    128         0        vex_timv();
  459.    122         0        v_show_c();
  460.    123         0        v_hide_c();
  461.    124         0        vq_mouse();
  462.    125         0        vex_butv();
  463.    126         0        vex_motv();
  464.    127         0        vex_curv();
  465.    128         0        vq_key_s();
  466.  
  467. Textmodus und VT52:
  468.  
  469.    5           1        vq_chcells();
  470.    5           2        v_exit_cur();
  471.    5           3        v_enter_cur();
  472.    5           4        v_curup();
  473.    5           5        v_curdown();
  474.    5           6        v_curright();
  475.    5           7        v_curleft();
  476.    5           8        v_curhome();
  477.    5           9        v_eeos();
  478.    5           10       v_eeol();
  479.    5           11       v_curaddress();
  480.    5           12       v_curtext();
  481.    5           13       v_rvon();
  482.    5           14       v_rvoff();
  483.    5           15       vq_curaddress();
  484.  
  485.  
  486.  
  487.  
  488. Gerätetreiber und Offscreen-Bitmaps
  489. ===================================
  490.  
  491. ∙ OPEN WORKSTATION (VDI 1)
  492.  
  493. Mit dieser Funktion öffnen Sie eine physikalische Workstation. Dazu wird ein in
  494. der ASSIGN.SYS-Datei eingetragener Gerätetreiber geladen und den Eingaben
  495. entsprechend initialisiert.
  496.  
  497. Wenn die Initialisierung erfolgreich verlaufen ist, wird in contrl[6] eine
  498. Kennung (im weiteren Verlauf Handle genannt) zurückgegeben, andernfalls eine
  499. Null.
  500.  
  501. Wichtig: Der Bildschirmtreiber wird nach Abarbeitung des AUTO-Ordners vom AES
  502.          geöffnet. Anwenderprogramme müssen daher zur  Bildschirmausgabe eine
  503.          virtuelle  Workstation  (VDI  100) öffnen.
  504.  
  505. Dekl.:  void v_opnwk( WORD *work_in, WORD *handle, WORD *work_out );
  506. Aufruf: v_opnwk( work_in, &handle, work_out );
  507.  
  508. Variable         Belegung            Bedeutung
  509. Eingaben:
  510.  
  511. contrl[0]        1                   v_opnwk
  512. contrl[1]        0                   Einträge in ptsin
  513. contrl[3]        11                  Einträge in intin
  514. contrl[6]        0 oder 1
  515. intin[0..10]     work_in[0..10]
  516.  
  517. Ausgaben:
  518.  
  519. contrl[2]        6                   Einträge in ptsout
  520. contrl[4]        45                  Einträge in intout
  521. contrl[6]        handle
  522. intout[0..44]    work_out[0..44]
  523. ptsout[0..11]    work_out[45..56]
  524.  
  525. Bedeutung von work_in[0..10]:
  526. work_in[0]: Geräteidentifikationsnummer.  Mit  ihr wählen Sie den zu  ladenden
  527.             Gerätetreiber.
  528.  
  529.             1-10 : Bildschirmtreiber
  530.             1:    aktuelle Auflösung
  531.             2:    320*200,  16 Farben
  532.             3:    640*200,  4 Farben
  533.             4:    640*400,  monochrom
  534.             6:    640*480,  16 Farben  (TT)
  535.             8:    1280*960, monochrom  (TT)
  536.             9:    320*480,  256 Farben (TT)
  537.  
  538.             ab 11:Plottertreiber
  539.             ab 21:Druckertreiber
  540.             ab 31:Metafiletreiber
  541.             ab 41:Kamera
  542.             ab 51:Grafiktablett
  543.             ab 61:Memory-Treiber
  544.  
  545. work_in[1]: Linientyp
  546. work_in[2]: Linienfarbe
  547. work_in[3]: Markertyp
  548. work_in[4]: Markerfarbe
  549. work_in[5]: Zeichensatznummer
  550. work_in[6]: Textfarbe
  551. work_in[7]: Fülltyp
  552. work_in[8]: Füllmuster-Index
  553. work_in[9]: Füllmuster-Farbe
  554. work_in[10]:Koordinatenflag 0: NDC , 2: RC
  555.  
  556. Bedeutung von work_out[0..56]:
  557. work_out[0]:  Adressierbare Rasterbreite (Wertebereich 0 - xmax)
  558. work_out[1]:  Adressierbare Rasterhöhe   (Wertebereich 0 - ymax)
  559. work_out[2]:  Gerätekoordinatenflag
  560.               0: genaue Skalierung möglich (z.B. Bildschirm)
  561.               1: keine genaue Skalierung möglich (Film-Recorder)
  562. work_out[3]:  Breite eines Pixels in Mikrometern
  563. work_out[4]:  Höhe eines Pixels in Mikrometern
  564. work_out[5]:  Anzahl der Zeichenhöhen (0: beliebig veränderbar)
  565. work_out[6]:  Anzahl der Linientypen
  566. work_out[7]:  Anzahl der Linienbreiten (0: beliebig veränderbar)
  567. work_out[8]:  Anzahl der Markertypen
  568. work_out[9]:  Anzahl der Markergrö₧en (0: beliebig veränderbar)
  569. work_out[10]: Anzahl der verfügbaren Zeichensätze
  570. work_out[11]: Anzahl der Muster
  571. work_out[12]: Anzahl der Schraffuren
  572. work_out[13]: Anzahl der Farben
  573. work_out[14]: Anzahl der GDPs
  574. work_out[15] bis work_out[24]:
  575.               Liste der GDPs, deren Ende durch -1 gekennzeichnet ist.
  576. work_out[25] bis work_out[34]:
  577.               Liste der Attribute der GDPs:
  578.               0: Linie
  579.               1: Marker
  580.               2: Text
  581.               3: ausgefüllter Bereich
  582.               4: keine Attribute
  583. work_out[35]: Farbdarstellungsflag
  584. work_out[36]: Textrotationsflag
  585. work_out[37]: Flächenfüllung
  586. work_out[38]: CELLARRAY-Flag
  587. work_out[39]: Anzahl der Farbabstufungen (0: mehr als 32767)
  588. work_out[40]: Kontrolle des Mauszeigers
  589.               1: Tastatur
  590.               2: Tastatur und Maus (oder anderes Gerät)
  591. work_out[41]: Gerät für variierende Eingaben
  592.               1: Tastatur
  593.               2: anderes Gerät
  594. work_out[42]: Auswahltasten
  595.               1: Funktionstasten
  596.               2: anderes Tastenfeld
  597. work_out[43]: String-Eingabe
  598.               1: Tastatur
  599. work_out[44]: Geräte-Typ
  600.               0: nur Ausgabe
  601.               1: Eingabe
  602.               2: Ein- u. Ausgabe
  603.               4: Metafile-Ausgabe
  604. work_out[45]: geringste Zeichenbreite
  605. work_out[46]: geringste Zeichenhöhe
  606. work_out[47]: grö₧te Zeichenbreite
  607. work_out[48]: grö₧te Zeichenhöhe
  608. work_out[49]: geringste Linienbreite
  609. work_out[50]: 0
  610. work_out[51]: grö₧te Linienbreite
  611. work_out[52]: 0
  612. work_out[53]: geringste Markerbreite
  613. work_out[54]: geringste Markerhöhe
  614. work_out[55]: grö₧te Markerbreite
  615. work_out[56]: grö₧te Markerhöhe
  616.  
  617. Bei NVDI-Drucker- und IMG-Treibern kann au₧erdem das Seitenformat und der
  618. Ausgabekanal gesetzt werden. Bei META.SYS wirkt sich die Einstellung des
  619. Seitenformats nicht aus (sollte auf 0 gesetzt werden), der Dateiname wird aber
  620. für den Metafile übernommen.
  621.  
  622. Variable         Belegung            Bedeutung
  623. Eingaben:
  624.  
  625. contrl[0]        1                   v_opnwk
  626. contrl[1]        0                   Einträge in ptsin
  627. contrl[3]        16                  Einträge in intin
  628. contrl[6]        0 oder 1
  629. intin[0..15]     work_in[0..15]
  630.  
  631. Ausgaben:
  632. wie oben beschrieben
  633.  
  634. Bedeutung von work_in[11..15]:
  635. work_in[11]:   Seitenformat
  636.                #define  PAGE_DEFAULT   0     /* Voreinstellung benutzen */
  637.                #define  PAGE_A3        1     /* DIN A3 */
  638.                #define  PAGE_A4        2     /* DIN A4 */
  639.                #define  PAGE_A5        3     /* DIN A5 */
  640.                #define  PAGE_B5        4     /* DIN B5 */
  641.  
  642.                #define  PAGE_LETTER    16    /* Letter size */
  643.                #define  PAGE_HALF      17    /* Half size */
  644.                #define  PAGE_LEGAL     18    /* Legal size */
  645.                #define  PAGE_DOUBLE    19    /* Double size */
  646.                #define  PAGE_BROAD     20    /* Broad sheet size */
  647.  
  648. work_in[12/13]: Zeiger auf einen GEMDOS-Dateinamen (C-String) oder Null
  649. work_in[14]:    0, reserviert
  650. work_in[15]:    0, reserviert
  651.  
  652.  
  653. ∙ CLOSE WORKSTATION (VDI 2)
  654.  
  655. "CLOSE WORKSTATION" schlie₧t eine physikalische Workstation. Vorher sollten alle
  656. virtuellen Workstations geschlossen werden.
  657. Bei Druckertreibern werden vor dem Schlie₧en ggf. die noch gepufferten Kommandos
  658. ausgeführt, bei Metafiletreibern wird der Metafile geschlo₧en. Man beachte, da₧
  659. das Schlie₧en der Workstation bei Druckertreibern keinen Seitenvorschub auslöst.
  660.  
  661. Dekl.:  void v_clswk( WORD handle );
  662. Aufruf: v_clswk( handle );
  663.  
  664. Variable         Belegung            Bedeutung
  665. Eingaben:
  666.  
  667. contrl[0]        2                   v_clswk
  668. contrl[1]        0                   Einträge in ptsin
  669. contrl[3]        0                   Einträge in intin
  670. contrl[6]        handle
  671.  
  672. Ausgaben:
  673.  
  674. contrl[2]        0                   Einträge in ptsout
  675. contrl[4]        0                   Einträge in intout
  676.  
  677.  
  678. ∙ OPEN VIRTUAL SCREEN WORKSTATION (VDI 100)
  679.  
  680. "OPEN VIRTUAL SCREEN WORKSTATION" öffnet eine virtuelle Bildschirm-Workstation
  681. auf einer bereits geöffneten physikalischen Workstation. Dadurch können die
  682. Zugriffe verschiedener Programme mit ihren unterschiedlichen Einstellungen
  683. koordiniert werden. Für Bildschirmtreiber müssen Sie das Handle der
  684. AES-Bildschirm-Workstation nach der Anmeldung Ihres Programmes beim AES mit.
  685.  
  686.   aes_handle = graf_handle(&gr_hwchar,&gr_hhchar,&gr_hwbox,&gr_hhbox);
  687.   handle = aes_handle;
  688.  
  689. ermitteln.
  690.  
  691. Dekl.:  void v_opnvwk( WORD *work_in, WORD *handle, WORD *work_out );
  692. Aufruf: v_opnvwk( work_in, &handle, work_out );
  693.  
  694. Variable         Belegung            Bedeutung
  695. Eingaben:
  696.  
  697. contrl[0]        100                 v_opnvwk
  698. contrl[1]        0                   Einträge in ptsin
  699. contrl[3]        11                  Einträge in intin
  700. contrl[6]        handle              Handle der physikalischen Workstation
  701. intin[0..10]     work_in[0..10]
  702.  
  703. Ausgaben:
  704.  
  705. contrl[2]        6                   Einträge in ptsout
  706. contrl[4]        45                  Einträge in intout
  707. contrl[6]        handle              Handle der virtuellen Workstation
  708. intout[0..44]    work_out[0..44]
  709. ptsout[0..11]    work_out[45..56]
  710.  
  711. Die Bedeutung der Ein- und Ausgaben ist mit denen von "OPEN WORKSTATION"
  712. identisch.
  713.  
  714.  
  715. ∙ CLOSE VIRTUAL SCREEN WORKSTATION (VDI 101)
  716.  
  717. Mit dieser Funktion wird eine geöffnete virtuelle Workstation geschlossen.
  718.  
  719. Dekl.:  void v_clsvwk( WORD handle );
  720. Aufruf: v_clsvwk( handle );
  721.  
  722. Variable         Belegung            Bedeutung
  723. Eingaben:
  724.  
  725. contrl[0]        101                 v_clsvwk
  726. contrl[1]        0                   Einträge in ptsin
  727. contrl[3]        0                   Einträge in intin
  728. contrl[6]        handle
  729.  
  730. Ausgaben:
  731. contrl[2]        0                   Einträge in ptsout
  732. contrl[4]        0                   Einträge in intout
  733.  
  734.  
  735. ∙ CLEAR WORKSTATION (VDI 3)
  736.  
  737. Diese Funktion löscht den Bildschirm. Bei Plottern oder Druckern wird ein
  738. Seitenvorschub durchgeführt und der Druckpuffer gelöscht.
  739.  
  740. Deklaration: void v_clrwk( WORD handle );
  741. Aufruf:      v_clrwk( handle);
  742.  
  743. Variable         Belegung            Bedeutung
  744. Eingaben:
  745.  
  746. contrl[0]        3                   v_clrwk
  747. contrl[1]        0                   Einträge in ptsin
  748. contrl[3]        0                   Einträge in intin
  749. contrl[6]        handle
  750.  
  751. Ausgaben:
  752.  
  753. contrl[2]        0                   Einträge in ptsout
  754. contrl[4]        0                   Einträge in intout
  755.  
  756.  
  757. ∙ CLEAR DISPLAY LIST (VDI 5, Escape 22)
  758.  
  759. Diese Funktion löscht bei Plottern oder Druckern den Druckerpuffer. Im Gegensatz
  760. zu CLEAR WORKSTATION wird jedoch kein Seitenvorschub durchgeführt.
  761. Diese Funktion sollte z.B. dann aufgerufen werden, wenn der Benutzer die
  762. Grafikausgaben vor dem Ausdruck (also vor dem UPDATE WORKSTATION) abbrechen
  763. möchte.
  764.  
  765. Deklaration: void v_clear_disp_list( WORD handle );
  766. Aufruf:      v_clear_disp_list( handle);
  767.  
  768. Variable         Belegung            Bedeutung
  769. Eingaben:
  770.  
  771. contrl[0]        5                   v_escape
  772. contrl[1]        0                   Einträge in ptsin
  773. contrl[3]        0                   Einträge in intin
  774. contrl[5]        22                  Unterfunktionsnummer v_clear_disp_list
  775. contrl[6]        handle
  776.  
  777. Ausgaben:
  778.  
  779. contrl[2]        0                   Einträge in ptsout
  780. contrl[4]        0                   Einträge in intout
  781.  
  782.  
  783. ∙ UPDATE WORKSTATION (VDI 4)
  784.  
  785. Diese Funktion wird auf Geräten wie z.B. Druckern aufgerufen, die VDI-Kommandos
  786. in einer Liste puffern. "UPDATE WORKSTATION" veranla₧t die Ausführung dieser
  787. gepufferten Kommandos. Bei Bildschirm-Workstations oder Offscreen-Bitmaps mu₧
  788. diese Funktion nicht aufgerufen werden, da Grafikkommandos sofort abgearbeitet
  789. werden.
  790.  
  791. Dekl.:  void v_updwk( WORD handle );
  792. Aufruf: v_updwk( handle );
  793.  
  794. Variable         Belegung            Bedeutung
  795. Eingaben:
  796.  
  797. contrl[0]        4                   v_updwk
  798. contrl[1]        0                   Einträge in ptsin
  799. contrl[3]        0                   Einträge in intin
  800. contrl[6]        handle
  801.  
  802. Ausgaben:
  803.  
  804. contrl[2]        0                   Einträge in ptsout
  805. contrl[4]        0                   Einträge in intout
  806.  
  807.  
  808. ∙ OPEN BITMAP (VDI 100, 1)
  809.  
  810. Der Aufruf von "OPEN BITMAP" erzeugt eine Off-Screen-Bitmap auf der mit
  811. VDI-Funktionen gezeichnet werden kann. Die Bitmap kann entweder übergeben werden
  812. oder das VDI alloziert selber den dafür nötigen Speicher. Die zu übergebenden
  813. Pixelgrö₧en werden bei den Vektorfonts beachtet, so da₧ die Ma₧haltigkeit
  814. gewährt ist.
  815. Die Benutzung von Offscreen-Bitmaps bietet sich auch dann an, wenn man Effekte
  816. wie starkes Flackern vermeiden möchte. In diesem Fall baut man Teile der Grafik
  817. in der Bitmap auf und überträgt die Bitmap mit vrt_cpyfm() oder vro_cpyfm() auf den
  818. Bildschirm.
  819.  
  820. Dekl.:  void v_opnbm( WORD *work_in, MFDB *bitmap, WORD *handle, WORD *work_out );
  821. Aufruf: v_opnbm( work_in, &bitmap, &handle, work_out );
  822.  
  823. Variable         Belegung            Bedeutung
  824. Eingaben:
  825.  
  826. contrl[0]        100                 v_opnbm
  827. contrl[1]        0                   Einträge in ptsin
  828. contrl[3]        20                  Einträge in intin
  829. contrl[5]        1                   Unterfunktionsnummer für v_opnbm
  830. contrl[6]        handle              Handle der physikalischen Workstation
  831. contrl[7..8]     bitmap              Zeiger auf einen MFDB der Bitmap
  832. intin[0..19]     work_in[0..19]
  833.  
  834. Ausgaben:
  835.  
  836. contrl[2]        6                   Einträge in ptsout
  837. contrl[4]        45                  Einträge in intout
  838. contrl[6]        handle              Handle der Bitmap
  839. intout[0..44]    work_out[0..44]
  840. ptsout[0..11]    work_out[45..56]
  841.  
  842. Bedeutung von work_in:
  843. work_in[0..10]:   wie bei v_opnwk()/v_opnvwk() definiert
  844. work_in[11]:      Breite -1 (z.B. 1279)
  845. work_in[12]:      Höhe -1 (z.B. 959)
  846. work_in[13]:      Breite eines Pixels in Mikrometern
  847. work_in[14]:      Höhe eines Pixels in Mikrometern
  848. work_in[15..19]:  mu₧ 0 sein, wenn das gerätespezifische Format benutzt wird
  849.  
  850. Bedeutung von bitmap:
  851. Bitmap ist ein Zeiger auf einen MFDB. Falls bitmap->fd_addr gleich NULL ist, so
  852. wird anhand der Grö₧enangaben in work_in Speicher für die Bitmap angefordert
  853. (die Bitmap wird im Gegensatz zu v_opnvwk() gelöscht).
  854.  
  855. Um eine Bitmap im gerätespezifischen Format zu öffnen, mu₧ bitmap->fd_nplanes
  856. eine Null oder die Ebenenanzahl des Schirms enthalten (work_out[4] bei
  857. vq_extnd()). Ist bitmap->fd_nplanes 1, wird eine monochrome Bitmap angelegt.
  858.  
  859. Die Einträge des MFDB (fd_addr, fd_w, fd_h, fd_wdwidth, fd_stand, fd_nplanes)
  860. werden vom VDI-Treiber gesetzt und an die aufrufende Applikation zurückgegeben.
  861. Wenn nicht nicht genügend Speicher vorhanden ist, wird der Inhalt des MFDBs
  862. nicht verändert; ein Null-Handle wird zurückgegeben.
  863.  
  864. Wenn bitmap->fd_addr ungleich NULL ist, wird dieser Eintrag als Zeiger auf eine
  865. Bitmap interpretiert. Wenn die Bitmap im Standardformat vorliegt, wird sie ins
  866. gerätespezifische Format umgewandelt. Liegt sie schon im gerätespezifischen
  867. Format vor, so wird sie nicht umgewandelt. Falls die Auflösung der Bitmap (d.h.
  868. die Anzahl der Farben und Planes) nicht unterstützt wird, gibt v_opnbm() ein
  869. Null-Handle zurück.
  870.  
  871. Ab EdDI 1.1 kann v_opnbm() mit zusätzlichen Parametern in work_in[15..19]
  872. aufgerufen werden. Es wird dann versucht, eine Bitmap in dem durch diese
  873. Parameter beschriebenen Format zu öffnen. Sollte für das angegebene Format kein
  874. Treiber vorhanden sein, kann die Bitmap nicht erzeugt werden.
  875.  
  876. work_in[15..16]:  Anzahl der gleichzeitig darstellbaren Farben
  877. work_in[17]:      Anzahl der Planes
  878. work_in[18]:      Pixelformat
  879. work_in[19]:      Bitreihenfolge
  880.  
  881. Pixelformat und Bitreihenfolge werden bei vq_scrninfo() genauer beschrieben. Mit
  882. den folgenden Parametern kann z.B. eine Offscreen-Bitmap mit 256 Farben und
  883. Interleaved Planes erzeugt werden:
  884.  
  885. work_in[15..16] = 256;  /* 256 gleichzeitig darstellbare Farben */
  886. work_in[17] = 8;        /* 8 Farbebenen */
  887. work_in[18] = 0;        /* Interleaved Planes */
  888. work_in[19] = 1;        /* normale Bitreihenfolge (Motorola-Format) */
  889.  
  890.  
  891. ∙ CLOSE BITMAP (VDI 101, 1)
  892.  
  893. Die Funktion v_clsbm() schlie₧t die mit handle bezeichnete Bitmap. Wenn der
  894. Speicher bei v_opnbm() vom VDI alloziert wurde, gibt sie diesen Speicher wieder
  895. frei.
  896.  
  897. Dekl.:  void v_clsbm( WORD handle );
  898. Aufruf: v_clsbm( handle );
  899.  
  900. Variable         Belegung            Bedeutung
  901. Eingaben:
  902.  
  903. contrl[0]        101                 v_clsbm
  904. contrl[1]        0                   Einträge in ptsin
  905. contrl[3]        0                   Einträge in intin
  906. contrl[5]        1                   Unterfunktionsnummer für v_clsbm()
  907. contrl[6]        handle
  908.  
  909. Ausgaben:
  910.  
  911. contrl[2]        0                   Einträge in ptsout
  912. contrl[4]        0                   Einträge in intout
  913.  
  914.  
  915. ∙ EXTENDED INQUIRE FUNCTION (VDI 102)
  916.  
  917. Von dieser Funktion werden entweder die Parameter von v_opnwk()/v_opnvwk() oder
  918. erweiterte Auskünfte zum Gerätetreiber und zum Gerät zurückgeliefert.
  919.  
  920. Dekl.:  void vq_extnd( WORD handle, WORD flag, WORD *work_out );
  921. Aufruf: vq_extnd( handle, owflag, work_out );
  922.  
  923. Variable         Belegung            Bedeutung
  924. Eingaben:
  925.  
  926. contrl[0]        102                 vq_extnd
  927. contrl[1]        0                   Einträge in ptsin
  928. contrl[3]        1                   Einträge in intin
  929. contrl[6]        handle
  930. intin[0]         flag                Informationstyp
  931.  
  932. Ausgaben:
  933.  
  934. contrl[2]        6                   Einträge in ptsout
  935. contrl[4]        45                  Einträge in intout
  936. intout[0..44]    work_out[0..44]
  937. ptsout[0..11]    work_out[45..56]
  938.  
  939. Bedeutung von flag:
  940. 0: Parameter von v_opnwk()/v_opnvwk()
  941. 1: erweiterte Parameter
  942.  
  943. Bedeutung von work_out:
  944. work_out[0]:  Bildschirmtyp
  945.               0: kein Bildschirm
  946.               1: getrennter Text- und Grafikmodus und getrennter
  947.                  Bildspeicher
  948.               2: getrennter Text- und Grafikmodus mit gemeinsamem
  949.                  Bildspeicher
  950.               3: gemeinsamer Text- und Grafikmodus mit getrenntem
  951.                  Bildspeicher
  952.               4: gemeinsamer Text- und Grafikmodus mit gemeinsamem
  953.                  Bildspeicher
  954. work_out[1]:  Anzahl der Farbabstufungen
  955. work_out[2]:  Anzahl der Texteffekte
  956. work_out[3]:  Flag für Vergrö₧erung des Rasters
  957.               0: Vergrö₧erung nicht möglich
  958.               1: Vergrö₧erung möglich
  959. work_out[4]:  Anzahl der Bildebenen
  960. work_out[5]:  "Color lookup table"-Unterstützung
  961.               0: nicht möglich
  962.               1: möglich
  963. work_out[6]:  Anzahl der 16*16-Pixel-Raster-Operationen pro Sekunde
  964. work_out[7]:  Verfügbarkeit der Flächenfüllung (v_contourfill)
  965.               0: nicht verfügbar
  966.               1: verfügbar
  967. work_out[8]:  Textrotation
  968.               0: nicht möglich
  969.               1: in 90-Grad-Schritten
  970.               2: in 1/10-Grad-Schritten
  971. work_out[9]:  Anzahl der Schreibmodi
  972. work_out[10]: Eingabemodi
  973.               0: keine
  974.               1: Request
  975.               2: Request und Sample
  976. work_out[11]: Textausrichtung:
  977.               0: nicht verfügbar
  978.               1: verfügbar
  979. work_out[12]: Farbstiftwechsel
  980.               0: nicht möglich
  981.               1: möglich
  982. work_out[13]: Farbbandwechsel
  983.               0: nicht möglich
  984.               1: farbige Zeilen
  985.               2: farbige Zeilen und Rechtecke
  986. work_out[14]: maximale   Anzahl   der   Koordinatenpaare   für   Polyline,
  987.               Polymarker, und Filled Area oder -1 (unbegrenzt)
  988. work_out[15]: maximale Länge des intin-Array oder -1 (unbegrenzt)
  989. work_out[16]: Anzahl der Maustasten
  990. work_out[17]: Verfügbarkeit von Linientypen für breite Linien
  991.               0: nicht verfügbar
  992.               1: verfügbar
  993. work_out[18]: Anzahl der Schreibmodi für breite Linien
  994. work_out[19]: Clipping-Flag
  995.               0: Clipping aus
  996.               1: Clipping an
  997. work_out[20]: 0: keine genaueren Pixelgrö₧en in den folgenden Feldern
  998.               1: Pixelausma₧e werden in 1/10 Mikrometern zurückgeliefert
  999.               2: Pixelausma₧e werden in 1/100 Mikrometern zurückgeliefert
  1000.               3: Pixelausma₧e werden in 1/1000 Mikrometern zurückgeliefert
  1001.  
  1002. work_out[21]: Pixelbreite in 1/10, 1/100 oder 1/1000 Mikrometern
  1003. work_out[22]: Pixelhöhe in 1/10, 1/100 oder 1/1000 Mikrometern
  1004. work_out[23]: horizontale Auflösung in dpi
  1005. work_out[24]: vertikale Auflösung in dpi
  1006. work_out[28]: Bezier-Flag. Bit 1 gibt Auskunft über die Bezierfähigkeiten
  1007.               0: Keine Beziers
  1008.               1: Beziers
  1009.  
  1010. work_out[40]: nicht bedruckbarer linker Rand in Pixeln (nur Drucker usw.)
  1011. work_out[41]: nicht bedruckbarer oberer Rand in Pixeln (nur Drucker usw.)
  1012. work_out[42]: nicht bedruckbarer rechter Rand in Pixeln (nur Drucker usw.)
  1013. work_out[43]: nicht bedruckbarer unterer Rand in Pixeln (nur Drucker usw.)
  1014.  
  1015. work_out[45..48]: Clipping-Rechteck
  1016.  
  1017. Bemerkungen:
  1018. Wenn work_out[20] einen Wert ungleich 0 enthält, werden in den Elementen 21-24
  1019. und 40-43 zusätzliche Informationen über Pixelgrö₧e und nicht bedruckbare
  1020. Ränder übergeben. Die nicht bedruckbaren Ränder werden normalerweise nur bei
  1021. Druckertreibern zurückgeliefert. Sie ermöglichen Applikationen, Dokumente zu
  1022. zentrieren oder dem Benutzer ein zutreffendes Bild der ausgedruckten Seite zu
  1023. liefern, indem die Ränder im Dokument angezeigt werden (der bei v_opnwk() in
  1024. work_in[0/1] zurückgelieferte Bereich ist der bedruckbare Bereich).
  1025.  
  1026. Wenn genauere Pixelgrö₧en zurückgeliefert werden, sollte man diese besonders
  1027. beim Drucken zur Positionsberechnung der einzelnen Grafikobjekte benutzen, denn
  1028. die Benutzung der Werte in work_out[3..4] kann im schlimmsten Fall auf einem
  1029. DIN A4 Blatt zu einer Ungenauigkeit von insgesamt 2 bis 3 mm führen.
  1030.  
  1031. Die Rückgabe des Clipping-Flags (work_out[19]) und des Clipping-Rechtecks
  1032. (work_out[45..48]) ist GEM 2.x-kompatibel. Unter dem ATARI-VDI wird das
  1033. Clipping-Flag nicht zurückgegeben, wohl aber das Clipping-Rechteck (obwohl das
  1034. nicht dokumentiert ist) - Benutzung also auf eigene Gefahr!
  1035.  
  1036. Die  Rückgabe  des  Bezier-Flag (work_out[28], Bit 1) ist GEM/3-kompatibel. Im
  1037. ATARI-VDI ist work_out[28] reserviert und enthält eine Null.
  1038.  
  1039.  
  1040. ∙ INQUIRE SCREEN INFORMATION (VDI 102, 1)
  1041.  
  1042. "INQUIRE SCREEN INFORMATION" liefert genauere Angaben über Bildschirmformat
  1043. (auch gerätespezifisches Format genannt).
  1044. Diese Informationen sind in erster Linie interessant für Programme, die
  1045. -  schnell Raster aufbauen (dithern) und diese mit vro_cpyfm() kopieren möchten.
  1046. -  farbige Raster speichern (XIMGs, TIFFs, JPEGs).
  1047.  
  1048. Dekl.:  void vq_scrninfo( WORD handle, WORD *work_out );
  1049. Aufruf: vq_scrninfo( handle, work_out );
  1050.  
  1051. Variable         Belegung            Bedeutung
  1052. Eingaben:
  1053.  
  1054. contrl[0]        102                 vq_scrninfo
  1055. contrl[1]        0                   Einträge in ptsin
  1056. contrl[3]        1                   Einträge in intin
  1057. contrl[5]        1                   Unterfunktionsnummer von vq_scrninfo()
  1058. contrl[6]        handle
  1059. intin[0]         2                   erweiterte Informationen ausgeben
  1060.  
  1061. Ausgaben:
  1062.  
  1063. contrl[2]        0                   Einträge in ptsout
  1064. contrl[4]        272                 Einträge in intout
  1065. intout[0..272]   work_out[0..272]    erweiterte Informationen
  1066.  
  1067. Bedeutung von work_out:
  1068. work_out[0]:   Formatangabe:
  1069.                0: Interleaved Planes, wortweise (ATARI Grafik)
  1070.                1: Standardformat (komplette Planes)
  1071.                2: Packed Pixels
  1072.                -1: unbekanntes Format; nicht direkt beschreibbar
  1073. work_out[1]:   Verfügbarkeit einer CLUT:
  1074.                0: keine CLUT (z.B. TTM 194)
  1075.                1: Hardware-CLUT
  1076.                2: Software-CLUT (HiColor oder TrueColor)
  1077. work_out[2]:   Anzahl der Ebenen (Bits) pro Pixel
  1078. work_out[3/4]: Farbanzahl oder 0L (mehr als 2*10^31 Farben)
  1079. work_out[5]:   Breite einer Zeile in Bytes (erst ab EdDI 1.1)
  1080. work_out[6/7]: Adresse der Bitmap (erst ab EdDI 1.1)
  1081. work_out[8]:   Anzahl der Bits für die Rot-Intensität
  1082. work_out[9]:   Anzahl der Bits für die Grün-Intensität
  1083. work_out[10]:  Anzahl der Bits für die Blau-Intensität
  1084. work_out[11]:  Anzahl der Bits für den Alpha-Channel oder ähnliches
  1085. work_out[12]:  Anzahl der Bits für Genlock
  1086. work_out[13]:  Anzahl der nicht benutzen Bits
  1087. work_out[14]:  Bitorganisation (erst ab EdDI 1.1)
  1088.  
  1089.                Bei 2-256 Farben:
  1090.  
  1091.                Bitnummer | Bedeutung des Bits
  1092.                ----------|--------------------------------------------------
  1093.                   0      | normale Bitreihenfolge
  1094.  
  1095.                Bei 32768 Farben (16 Planes):
  1096.  
  1097.                Bitnummer | Bedeutung des Bits
  1098.                ----------|--------------------------------------------------
  1099.                   0      | normale Bitreihenfolge, d.h. 1 Overlay-Bit,
  1100.                          | 5 Rot-Bits, 5 Grün-Bits, 5 Blau-Bits
  1101.                          |
  1102.                   1      | Falcon-Format, d.h.  5 Rot-Bits, 5 Grün-Bits,
  1103.                          | 1 Overlay-Bit, 5 Blau-Bits
  1104.                          |
  1105.                   7      | Bytes vertauscht: Intel-Modell
  1106.  
  1107.                Bei 65536 Farben (16 Planes):
  1108.  
  1109.                Bitnummer | Bedeutung des Bits
  1110.                ----------|--------------------------------------------------
  1111.                   0      | normale Bitreihenfolge, d.h. 5 Rot-Bits,
  1112.                          | 6 Grün-Bits, 5 Blau-Bits
  1113.                          |
  1114.                   7      | Bytes vertauscht: Intel-Modell
  1115.  
  1116.                Bei 16777216 Farben (24 Planes):
  1117.  
  1118.                Bitnummer | Bedeutung des Bits
  1119.                ----------|--------------------------------------------------
  1120.                   0      | normale Bitreihenfolge, d.h. 8 Rot-Bits,
  1121.                          | 8 Grün-Bits, 8 Blau-Bits
  1122.                          |
  1123.                   7      | Bytes vertauscht: Intel-Modell
  1124.  
  1125.                Bei 16777216 Farben (32 Planes):
  1126.  
  1127.                Bitnummer | Bedeutung des Bits
  1128.                ----------|--------------------------------------------------
  1129.                   0      | normale Bitreihenfolge, d.h. 8 Overlay-Bits,
  1130.                          | 8 Rot-Bits, 8 Grün-Bits, 8 Blau-Bits
  1131.                          |
  1132.                   7      | Bytes vertauscht: Intel-Modell
  1133.  
  1134. Falls eine Hardware-CLUT (intout[1] == 1) vorhanden ist:
  1135. work_out[16-271]: Pixelwert des zugehörigen VDI-Farbindexes
  1136.  
  1137. Falls HiColor, TrueColor oder ähnliches vorhanden ist:
  1138. work_out[16..31]:    Zuordnung von Bitnummer im Pixel zum Bit der Rotintensität
  1139. work_out[32..47]:    Zuordnung von Bitnummer im Pixel zum Bit der Grünintens.
  1140. work_out[48..63]:    Zuordnung von Bitnummer im Pixel zum Bit der Blauintensität
  1141. work_out[64..79]:    Zuordnung der Bitnummer für Alpha-Channel
  1142. work_out[80..95]:    Zuordnung der Bitnummer für Genlock
  1143. work_out[96..127]:   unbenutzte Bits
  1144. work_out[128..271]:  reserviert (0)
  1145.  
  1146.    Beispiele:
  1147.    ----------
  1148.  
  1149.    In 256 Farben auf dem Falcon würden folgende Ausgaben erfolgen:
  1150.  
  1151.    work_out | Wert   | Bedeutung
  1152.    ---------|--------|-----------------------------------------------------
  1153.       0     |   0    | Interleaved Planes, wortweise
  1154.       1     |   1    | Hardware-CLUT vorhanden
  1155.       2     |   8    | 8 Bit pro Pixel
  1156.       3/4   | 256    | 256 verschiedene Farben gleichzeitig möglich
  1157.       5     | xxxx   | Bitmapbreite in Bytes (erst ab EdDI 1.1)
  1158.       6/7   | xxxxL  | Bitmapadresse (erst ab EdDI 1.1)
  1159.       8     |   6    | 6 Bits für die Rot-Intensität
  1160.       9     |   6    | 6 Bits für die Grün-Intensität
  1161.      10     |   6    | 6 Bits für die Blau-Intensität
  1162.      11     |   0    | kein Bit für Alpha-Channel
  1163.      12     |   0    | kein Bit für Genlock
  1164.      13     |   0    | kein unbenutzes Bit
  1165.      14     |   1    | normale Bitreihenfolge (erst ab EdDI 1.1)
  1166.             |        |
  1167.      16     |   0    | Pixelwert für VDI-Farbindex 0
  1168.      17     | 255    | Pixelwert für VDI-Farbindex 1
  1169.      18     |   2    | Pixelwert für VDI-Farbindex 2
  1170.      ...    | ...    |
  1171.     271     |  15    | Pixelwert für VDI-Farbindex 255
  1172.  
  1173.    In HiColor auf dem Falcon würden folgende Ausgaben erfolgen:
  1174.  
  1175.    work_out | Wert   | Bedeutung
  1176.    ---------|--------|-----------------------------------------------------
  1177.       0     |   2    | Packed Pixels
  1178.       1     |   2    | HiColor bzw. TrueColor
  1179.       2     |  16    | 16 Bit pro Pixel
  1180.       3/4   | 32768  | 32768 verschiedene Farben gleichzeitig möglich
  1181.       5     | xxxx   | Bitmapbreite in Bytes (erst ab EdDI 1.1)
  1182.       6/7   | xxxxL  | Bitmapadresse (erst ab EdDI 1.1)
  1183.       8     |   5    | 5 Bits für die Rot-Intensität
  1184.       9     |   5    | 5 Bits für die Grün-Intensität
  1185.      10     |   5    | 5 Bits für die Blau-Intensität
  1186.      11     |   0    | kein Bit für Alpha-Channel
  1187.      12     |   1    | ein Bit für Genlock
  1188.      13     |   0    | kein unbenutzes Bit
  1189.      14     |   2    | Falcon 15-Bit-Format mit 1 Overlay-Bit (erst ab EdDI 1.1)
  1190.             |        |
  1191.      16     |  11    | Bit 0 der Rot-Intensität (niederwertigstes Bit)
  1192.             |        | befindet sich in Bit 11 des Pixels
  1193.      17     |  12    | Bit 1 befindet sich in Bit 12 des Pixels
  1194.      18     |  13    | ...
  1195.      19     |  14    | ...
  1196.      20     |  15    | Bit 4 der Rot-Intensität (höchstwertigstes Bit)
  1197.             |        | befindet sich in Bit 15 des Pixels
  1198.      21..31 |  -1    | Bits werden nicht für Rot-Intensität benutzt
  1199.             |        |
  1200.             |        |
  1201.      32     |   6    | Bit 0 der Grün-Intensität (niederwertigstes Bit)
  1202.             |        | befindet sich in Bit 6 des Pixels
  1203.      33     |   7    | Bit 1 befindet sich in Bit 7 des Pixels
  1204.      34     |   8    | ...
  1205.      35     |   9    | ...
  1206.      36     |  10    | Bit 4 der Grün-Intensität (höchstwertigstes Bit)
  1207.             |        | befindet sich in Bit 10 des Pixels
  1208.      37..37 |  -1    | Bits werden nicht für Grün-Intensität benutzt
  1209.             |        |
  1210.             |        |
  1211.      48     |   0    | Bit 0 der Blau-Intensität (niederwertigstes Bit)
  1212.             |        | befindet sich in Bit 0 des Pixels
  1213.      49     |   1    | Bit 1 befindet sich in Bit 1 des Pixels
  1214.      50     |   2    | ...
  1215.      51     |   3    | ...
  1216.      52     |   4    | Bit 4 der Blau-Intensität (höchstwertigstes Bit)
  1217.             |        | befindet sich in Bit 4 des Pixels
  1218.      53..63 |  -1    | Bits werden nicht für Blau-Intensität benutzt
  1219.             |        |
  1220.             |        |
  1221.      64..79 |  -1    | kein Alpha-Channel
  1222.             |        |
  1223.             |        |
  1224.      80     |   5    | Bit für Genlock
  1225.      81..95 |  -1    | nicht für Genlock benutzt
  1226.             |        |
  1227.             |        |
  1228.      96..127|  -1    | keine unbenutzten Bits
  1229.             |        |
  1230.  
  1231.    In HiColor auf einer VGA-Grafikkarte würden folgende Ausgaben erfolgen:
  1232.  
  1233.    work_out | Wert   | Bedeutung
  1234.    ---------|--------|-----------------------------------------------------
  1235.       0     |   2    | Packed Pixels
  1236.       1     |   2    | HiColor bzw. TrueColor
  1237.       2     |  16    | 16 Bit pro Pixel
  1238.       3/4   | 32768  | 32768 verschiedene Farben gleichzeitig möglich
  1239.       5     | xxxx   | Bitmapbreite in Bytes (erst ab EdDI 1.1)
  1240.       6/7   | xxxxL  | Bitmapadresse (erst ab EdDI 1.1)
  1241.       8     |   5    | 5 Bits für die Rot-Intensität
  1242.       9     |   5    | 5 Bits für die Grün-Intensität
  1243.      10     |   5    | 5 Bits für die Blau-Intensität
  1244.      11     |   0    | kein Bit für Alpha-Channel
  1245.      12     |   0    | kein Bit für Genlock
  1246.      13     |   1    | ein unbenutzes Bit
  1247.      14     |  129   | 15 Bit in Intel-Darstellung (erst ab EdDI 1.1)
  1248.             |        |
  1249.      16     |   2    | Bit 0 der Rot-Intensität (niederwertigstes Bit)
  1250.             |        | befindet sich in Bit 11 des Pixels
  1251.      17     |   3    | Bit 1 befindet sich in Bit 12 des Pixels
  1252.      18     |   4    | ...
  1253.      19     |   5    | ...
  1254.      20     |   6    | Bit 4 der Rot-Intensität (höchstwertigstes Bit)
  1255.             |        | befindet sich in Bit 15 des Pixels
  1256.      21..31 |  -1    | Bits werden nicht für Rot-Intensität benutzt
  1257.             |        |
  1258.             |        |
  1259.      32     |  13    | Bit 0 der Grün-Intensität (niederwertigstes Bit)
  1260.             |        | befindet sich in Bit 6 des Pixels
  1261.      33     |  14    | Bit 1 befindet sich in Bit 7 des Pixels
  1262.      34     |  15    | ...
  1263.      35     |   0    | ...
  1264.      36     |   1    | Bit 4 der Grün-Intensität (höchstwertigstes Bit)
  1265.             |        | befindet sich in Bit 10 des Pixels
  1266.      37..37 |  -1    | Bits werden nicht für Grün-Intensität benutzt
  1267.             |        |
  1268.             |        |
  1269.      48     |   8    | Bit 0 der Blau-Intensität (niederwertigstes Bit)
  1270.             |        | befindet sich in Bit 0 des Pixels
  1271.      49     |   9    | Bit 1 befindet sich in Bit 1 des Pixels
  1272.      50     |  10    | ...
  1273.      51     |  11    | ...
  1274.      52     |  12    | Bit 4 der Blau-Intensität (höchstwertigstes Bit)
  1275.             |        | befindet sich in Bit 4 des Pixels
  1276.      53..63 |  -1    | Bits werden nicht für Blau-Intensität benutzt
  1277.             |        |
  1278.             |        |
  1279.      64..79 |  -1    | kein Alpha-Channel
  1280.             |        |
  1281.             |        |
  1282.      80..95 |  -1    | nicht für Genlock benutzt
  1283.             |        |
  1284.             |        |
  1285.      96     |   7    | unbenutztes Bit
  1286.      97..127|  -1    | keine unbenutzten Bits
  1287.             |        |
  1288.  
  1289. Bemerkungen:
  1290. Die Ausgaben in work_out[5..7/14] sind erst ab EdDI-Version 1.1 vorhanden und
  1291. sollen die Erkennung des Formats erleichtern. Bevor man auf sie zugreift, sollte
  1292. man noch die Version des EdDI-Cookies getestet haben.
  1293.  
  1294.  
  1295. ∙ INQUIRE DEVICE STATUS INFORMATION (VDI 248)
  1296.  
  1297. Vq_devinfo() liefert zurück, ob ein Treiber ein Treiber vorhanden ist und ob er
  1298. schon geöffnet wurde. Au₧erdem wird der Dateiname (z.B. XVGA256.SYS) und der
  1299. Klartextname (VGA 256 Farben) des Treibers zurückgeliefert. Wenn der Dateiname
  1300. leer ist, ist der Treiber nicht vorhanden.
  1301.  
  1302.  
  1303. Dekl.:  void  vq_devinfo( WORD handle, WORD device, WORD *dev_open,
  1304.                           BYTE *file_name, BYTE *device_name );
  1305. Aufruf: vq_devinfo( handle, device, &dev_open, file_name, device_name );
  1306.  
  1307. Variable         Belegung            Bedeutung
  1308. Eingaben:
  1309.  
  1310. contrl[0]        248                 vq_devinfo
  1311. contrl[1]        0                   Einträge in ptsin
  1312. contrl[3]        1                   Einträge in intin
  1313. contrl[6]        handle
  1314. intin[0]         device              VDI-Gerätenummer (0-99)
  1315.  
  1316. Ausgaben:
  1317.  
  1318. contrl[2]        p                   Anzahl der WÖRTER in ptsout
  1319. contrl[4]        i                   Anzahl der Wörter in intout
  1320.  
  1321. ptsout[0]        dev_open            0: Treiber ist noch nicht geöffenet
  1322.                                      1: Treiber ist bereits geöffnet
  1323. ptsout[1..p-1]   device_name         Klartextname des Treibers als C-String
  1324. intout[0..i-1]   file_name           Dateiname des Treibers
  1325.  
  1326. Bemerkungen:
  1327. Der Dateiname wird wortweise zurückgeliefert, d.h. 1 Wort pro Buchstabe, wobei
  1328. contrl[4] die Länge angibt. Der Klartextname wird als nullterminierter C-String
  1329. zurückgeliefert - contrl[2] enthält die Anzahl der _WÖRTER_ in ptsout.
  1330.  
  1331.  
  1332. ∙ INQUIRE EXTENDED DEVICE STATUS INFORMATION (VDI 248, 4242)
  1333.  
  1334. Ähnlich wie vq_devinfo() liefert vq_ext_devinfo() Treibernamen und
  1335. Informationen über den Treiber zurück. Das Format ist aber etwas sinnvoller.
  1336.  
  1337. Dekl.:  WORD  vq_ext_devinfo( WORD handle, WORD device, WORD *dev_exists,
  1338.                               BYTE *file_path, BYTE *file_name, BYTE *name );
  1339.  
  1340. Aufruf: dev_open = vq_ext_devinfo( handle, device, &dev_exists, file_path,
  1341.                                    file_name, name );
  1342.  
  1343. Variable         Belegung            Bedeutung
  1344. Eingaben:
  1345.  
  1346. contrl[0]        248                 vq_devinfo
  1347. contrl[1]        0                   Einträge in ptsin
  1348. contrl[3]        7                   Einträge in intin
  1349. contrl[5]        4242                Unterfunktionsnummer
  1350. contrl[6]        handle
  1351. intin[0]         device              VDI-Gerätenummer (0-99)
  1352. intin[1/2]       file_path           Zeiger auf den Datei-Pfad
  1353. intin[3/4]       file_name           Zeiger auf den Dateinamen
  1354. intin[5/6]       name                Zeiger auf den Klartextnamen
  1355.  
  1356. Ausgaben:
  1357.  
  1358. contrl[2]        0                   Einträge in ptsout
  1359. contrl[4]        2                   Einträge in intout
  1360. intout[0]        dev_exists          0: kein Treiber unter dieser Gerätekennung
  1361.                                      != 0: Treiber vorhanden
  1362. intout[1]:       dev_open            0: Treiber wurde noch nicht geöffnet
  1363.                                      != 0: Treiber wurde bereits geöffnet
  1364.  
  1365. Alle zurückgelieferten Zeichenketten sind C-Strings.
  1366.  
  1367.  
  1368. Besonderheiten einzelner Treiber
  1369.  
  1370. ∙ Druckertreiber - Gerätekennungen 21 bis 30
  1371.  
  1372.    Bei NVDI-Druckertreibern kann bei v_opnwk() das Seitenformat und das
  1373.    GEMDOS-Ausgabegerät gesetzt werden. Zusätzlich zu den normalen Eingaben bei
  1374.    v_opnwk() müssen die folgenden Parameter übergeben werden:
  1375.  
  1376.    contrl[3]   16
  1377.  
  1378.    intin[11]         Seitenformat
  1379.                      #define  PAGE_DEFAULT   0     /* Voreinstellung benutzen */
  1380.                      #define  PAGE_A3        1     /* DIN A3 */
  1381.                      #define  PAGE_A4        2     /* DIN A4 */
  1382.                      #define  PAGE_A5        3     /* DIN A5 */
  1383.                      #define  PAGE_B5        4     /* DIN B5 */
  1384.  
  1385.                      #define  PAGE_LETTER    16    /* Letter size */
  1386.                      #define  PAGE_HALF      17    /* Half size */
  1387.                      #define  PAGE_LEGAL     18    /* Legal size */
  1388.                      #define  PAGE_DOUBLE    19    /* Double size */
  1389.                      #define  PAGE_BROAD     20    /* Broad sheet size */
  1390.  
  1391.    intin[12/13]      Zeiger auf einen GEMDOS-Dateinamen (C-String) oder Null
  1392.    intin[14]   0     reserviert
  1393.    intin[15]   0     reserviert
  1394.  
  1395.    NICHT ZU EMPFEHLEN:
  1396.    Man kann Breite und Höhe der vom Druckertreiber zu erzeugenden Bitmap setzen,
  1397.    indem man in ptsin[0/1] Breite - 1, Höhe - 1 und in contrl[1] eine 1 einträgt
  1398.    und anschlie₧end v_opnwk() oder vq_extnd() aufruft. Dieses Verfahren ist
  1399.    NICHT ZU EMPFEHLEN, da eine Applikation nie genau abschätzen kann, wie gro₧
  1400.    die Bitmap tatsächlich sein darf, damit der Drucker sie vernünftig ausgeben
  1401.    kann.
  1402.  
  1403. ∙ META.SYS - Gerätekennung 31
  1404.  
  1405.    Der Metafile-Treiber speichert alle an ihn gerichteten Aufrufe in einem
  1406.    GEM-Metafile, der sich im aktuellen Verzeichnis der Applikation befindet und
  1407.    als Voreinstellung den Namen GEMFILE.GEM hat. Möchte man den Namen ändern,
  1408.    sollte man direkt nach v_opnwk() die Funktion vm_filename() aufrufen, der man
  1409.    einen kompletten Dateinamen mit dem gewünschten Pfad und Namen übergeben
  1410.    sollte.
  1411.    Damit andere Programme den Metafile vernünftig darstellen können, sollten die
  1412.    Funktionen v_meta_extents(), vm_pagesize() und vm_coords() aufgerufen werden.
  1413.  
  1414. ∙ MEMORY.SYS - Gerätekennung 61
  1415.  
  1416.    Der Treiber MEMORY.SYS stellt eine monochrome Bitmap zur Verfügung, auf die
  1417.    mit allen VDI-Befehlen zugegriffen werden kann. Die Auflösung dieser Bitmap
  1418.    wird bei v_opnwk() gesetzt. Hierzu wird in ptsin[0/1] Breite - 1 und Höhe - 1
  1419.    übergeben, contrl[1] mu₧ eine 1 enthalten. Nach v_opnwk() wird die Adresse
  1420.    der Bitmap in contrl[0/1] zurückgeliefert.
  1421.    Bei vq_extnd() kann man ebenfalls die Auflösung setzen. Au₧erdem besteht hier
  1422.    die Möglichkeit, einen eigenen Buffer zu Übergeben. In diesem Fall enthält
  1423.    contrl[3] eine 3 und intin[1/2] ist ein Zeiger auf den Buffer.
  1424.    Aufgrund der grö₧erern Flexiblität empfehlen wir OffScreenbitmaps anstelle
  1425.    des MEMORY.SYS-Treibers zu verwenden.
  1426.  
  1427. ∙ IMG.SYS - Gerätekennung 91 bis 99
  1428.  
  1429.    Genauso wie bei den NVDI-Druckertreibern kann man hier das Seitenformat und
  1430.    den Namen der IMG-Datei setzen - s.o.
  1431.  
  1432.    Eine weitere Möglichkeit den Dateinamen zu übergeben gibt es bei vq_extnd():
  1433.  
  1434.    contrl[1] = 4;
  1435.    ptsin[2] = 1157;
  1436.    ptsin[3/4] = Zeiger auf Dateinamen (BYTE *);
  1437.    ptsin[5/6] = Zeiger auf Fehlervariable (WORD *);
  1438.    ptsin[7] = 0;
  1439.  
  1440. ∙ Faxtreiber - meist Gerätekennung 81 bis 90
  1441.  
  1442.    Faxtreiber verhalten sich ähnlich wie Druckertreiber. Man kann bei Ihnen aber
  1443.    weder Seitenformat noch das GEMDOS-Gerät angeben. Man sollte auch nicht
  1444.    versuchen, die Grö₧e der Bitmap zu verändern.
  1445.  
  1446.  
  1447.  
  1448.  
  1449. Farbeinstellungen
  1450. =================
  1451.  
  1452. ∙ SET COLOR REPRESENTATION (VDI 14)
  1453.  
  1454. Mit dieser Funktion kann man die Farbabstufung einer Farbnummer  festlegen. Die
  1455. Intensität von Rot, Grün und Blau wird jeweils in Promille (0-1000) angegeben.
  1456. Bei Geräten mit einer CLUT (Grafiksysteme bis 8 Planes/ 256 Farben) wirken sich
  1457. die Einstellungen sofort auf alle Punkte aus, die bisher auf dem Bildschirm mit
  1458. dem Farbindex <index> gezeichnet wurden.
  1459.  
  1460. Bei mehr als 256 gleichzeitig darstellbaren Farben benutzen Grafiksysteme in der
  1461. Regel keine CLUT sondern eine direkte RGB-Zuordnung pro Pixel (siehe hierzu auch
  1462. vq_scrninfo()). Die einzelnen Pixel enthalten dann statt eines Farbindex einen
  1463. direkten RGB-Wert (z.B. je 8 Bit für R,G und B und 8 Bit Overlay). Bei einer
  1464. solchen Organisation stellt das VDI pro Workstation 256 lokale Farbstifte und
  1465. eine Pseudo-Palette zur Verfügung, für die man  mit vs_color() die Farbwerte
  1466. setzen kann. Eine Änderung  wirkt sich also erst dann aus, wenn man wieder mit
  1467. dem Farbstift zeichnet und wirkt sich immer nur auf die mit <handle> bezeichnete
  1468. Workstation aus.
  1469.  
  1470. Dekl.:  void vs_color( WORD handle, WORD index, RGB1000 *rgb_in );
  1471. Aufruf: vs_color( handle, index, &rgb_in );
  1472.  
  1473. Variable         Belegung            Bedeutung
  1474. Eingaben:
  1475.  
  1476. contrl[0]        14                  vs_color
  1477. contrl[1]        0                   Einträge in ptsin
  1478. contrl[3]        4                   Einträge in intin
  1479. contrl[6]        handle
  1480. intin[0]         index               Farbnummer
  1481. intin[1..3]      rgb_in              Farbintensitäten von Rot, Grün, Blau
  1482.  
  1483. Ausgaben:
  1484.  
  1485. contrl[2]        0                   Einträge in ptsout
  1486. contrl[4]        0                   Einträge in intout
  1487.  
  1488.  
  1489. ∙ INQUIRE COLOR REPRESENTATION (VDI 26)
  1490.  
  1491. "INQUIRE COLOR REPRESENTATION" gibt Auskunft über die eingestellten
  1492. Farbintensitäten, wobei die Möglichkeit besteht, zwischen der übergebenen und
  1493. der tatsächlich eingestellten Intensität zu unterscheiden.
  1494.  
  1495. Dekl.:  WORD vq_color( WORD handle, WORD color_index, WORD flag,
  1496.                        RGB1000 *rgb_out );
  1497. Aufruf: valid = vq_color( handle, color_index, set_flag, &rgb_out );
  1498.  
  1499. Variable         Belegung            Bedeutung
  1500. Eingaben:
  1501.  
  1502. contrl[0]        26                  vq_color
  1503. contrl[1]        0                   Einträge in ptsin
  1504. contrl[3]        2                   Einträge in intin
  1505. contrl[6]        handle
  1506. intin[0]         color_index         Farbnummer
  1507. intin[1]         flag                Flag für Art der Intensität
  1508.  
  1509. Ausgaben:
  1510.  
  1511. contrl[2]        0                   Einträge in ptsout
  1512. contrl[4]        4                   Einträge in intout
  1513. intout[0]        valid               Farbindex au₧erhalb der Grenzen
  1514. intout[1..3]     rgb_out             Intensität von Rot, Grün und Blau
  1515.  
  1516. Bedeutung von flag:
  1517. 0: es wird die vom  Anwender bei vs_color übergebene Farbintensität
  1518.    zurückgegeben.
  1519. 1: es wird die tatsächlich eingestellte Farbintensität zurückgegeben
  1520.  
  1521. Bemerkung:
  1522. Die an vs_color übergebene und die eingestellte Farbintensität können bei
  1523. Systemen mit einer CLUT voneinander abweichen, wenn die Anzahl der möglichen
  1524. Farbabstufungen zu klein ist. Bei Direct-RGB (keine CLUT) wird meistens die
  1525. tatsächlich eingestellte Intensität auch als die vom Anwender übergebene
  1526. Intensität zurückgeliefert, da die Anzahl der Abstufungen ausreichend gro₧ ist.
  1527.  
  1528.  
  1529. ∙ SET CALIBRATION (VDI 5, ESCAPE 76)
  1530.  
  1531. Mit SET CALIBRATION kann man die Farbkalibration ein- oder ausschalten und kann
  1532. eine Kalibrationstabelle übergeben. Eine Kalibrationstabelle besteht aus 1001
  1533. RGB-Einträgen, die für den Wertebereich 0 bis 1000 Promille jedem Eingabewert
  1534. einen korrigierten Promille-Wert zuordnet. Bevor man diese Funktion aufruft,
  1535. sollte man mit vq_clibrate() feststellen, ob sie überhaupt vorhanden ist.
  1536.  
  1537. Dekl.:  WORD vs_calibrate( WORD handle, WORD flag, RGB1000 *table );
  1538. Aufruf: cal_flag = vs_calibrate( handle, flag, &table );
  1539.  
  1540. Variable         Belegung            Bedeutung
  1541. Eingaben:
  1542.  
  1543. contrl[0]        5                   v_escape()
  1544. contrl[1]        0                   Einträge in ptsin
  1545. contrl[3]        3                   Einträge in intin
  1546. contrl[5]        76                  Unterfunktionsnummer vs_calibrate()
  1547. contrl[6]        handle
  1548. intin[0..1]      table               Zeiger auf Kalibrationstabelle oder 0L
  1549. intin[2]         flag                Kalibration aus (0) oder ein (1)
  1550. Ausgaben:
  1551.  
  1552. contrl[2]        0                   Einträge in ptsout
  1553. contrl[4]        1                   Einträge in intout
  1554. intout[0]        cal_flag            Kalibration aus (0) oder ein (1)
  1555.  
  1556. Bemerkung:
  1557. Die Farbkalibration ist im gesamten System für den mit <handle> bezeichneten
  1558. Treiber gültig. Daher sollte sie nicht von einzelnen Anwendungen, sondern nur
  1559. durch ein CPX-Modul oder Accessory eingestellt werden.
  1560.  
  1561.  
  1562. ∙ INQUIRE CALIBRATION (VDI 5, ESCAPE 77)
  1563.  
  1564. Diese Funktion liefert zurück, ob Funktionen zur Kalibrierung vorhanden sind und
  1565. ob die Kalibrierung eingeschaltet ist. Wenn contrl[4] einen 0 enthält, wird
  1566. Kalibrierung nicht unterstützt.
  1567.  
  1568. Dekl.:  WORD vq_calibrate( WORD handle, WORD *flag );
  1569. Aufruf: exists = vq_calibrate( handle, &flag );
  1570.  
  1571. Variable         Belegung            Bedeutung
  1572. Eingaben:
  1573.  
  1574. contrl[0]        5                   v_escape()
  1575. contrl[1]        0                   Einträge in ptsin
  1576. contrl[3]        0                   Einträge in intin
  1577. contrl[5]        77                  Unterfunktionsnummer vq_calibrate()
  1578. contrl[6]        handle
  1579.  
  1580. Ausgaben:
  1581.  
  1582. contrl[2]        0                   Einträge in ptsout
  1583. contrl[4]        exists              Einträge in intout (0 oder 1)
  1584. intout[0]        flag                Kalibration aus (0) oder ein (1)
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590. Verknüpfung und Zeichenbereich
  1591. ==============================
  1592.  
  1593. ∙ SET WRITING MODE (VDI 32)
  1594.  
  1595. Diese Funktion wählt die Verknüpfung der Grafikoperationen aus.  Bei  Übergabe
  1596. eines nicht vorhandenen Modus wird Modus 1 (REPLACE) angewählt.
  1597.  
  1598. Dekl.:  WORD vswr_mode( WORD handle, WORD mode );
  1599. Aufruf: set_mode = vswr_mode( handle, mode );
  1600.  
  1601. Variable         Belegung            Bedeutung
  1602. Eingaben:
  1603.  
  1604. contrl[0]        32                  vswr_mode
  1605. contrl[1]        0                   Einträge in ptsin
  1606. contrl[3]        1                   Einträge in intin
  1607. contrl[6]        handle
  1608. intin[0]         mode                gewünschter Verknüpfungsmodus
  1609.  
  1610. Ausgaben:
  1611.  
  1612. contrl[2]        0                   Einträge in ptsout
  1613. contrl[4]        1                   Einträge in intout
  1614. intout[0]        set_mode            ausgewählter Verknüpfungsmodus
  1615.  
  1616. Bedeutung von mode:
  1617. 1, REPLACE:          Alles, was sich unter dem Grafik-Element befindet, wird
  1618.                      überdeckt.
  1619. 2, TRANSPARENT:      Nur die gesetzen Pixel des Grafik-Elementes überdecken den
  1620.                      Hintergrund.
  1621. 3, XOR:              Pixel des Grafik-Elementes darunterliegende Pixel werden
  1622.                      mit einer XOR-Funktion verknüpft.
  1623. 4, REV. TRANSPARENT: Die nicht gesetzten Pixel des Grafik-Elements überdecken
  1624.                      den Hintergrund.
  1625.  
  1626.  
  1627. ∙ SET CLIPPING RECTANGLE (VDI 129)
  1628.  
  1629. Mit  dieser  Funktion  kann  man  den  Arbeitsbereich  der   Grafikoperationen
  1630. begrenzen oder freigeben.  Ist der Arbeitsbereich begrenzt worden,  so  werden
  1631. überstehende Teile nicht ausgegeben.
  1632.  
  1633. Dekl.:  void vs_clip( WORD handle, WORD clip_flag, WORD *area );
  1634. Aufruf: vs_clip( handle, clip_flag, area );
  1635.  
  1636. Variable         Belegung            Bedeutung
  1637. Eingaben:
  1638.  
  1639. contrl[0]        129                 vs_clip
  1640. contrl[1]        2                   Einträge in ptsin
  1641. contrl[3]        1                   Einträge in intin
  1642. contrl[6]        handle
  1643. intin[0]         clip_flag           0: Clipping aus, 1: Clipping an
  1644. ptsin[0..3]      area[0..3]          Arbeitsbereich
  1645.  
  1646. Ausgaben:
  1647.  
  1648. contrl[2]        0                   Einträge in ptsout
  1649. contrl[4]        0                   Einträge in intout
  1650.  
  1651. Bemerkung:
  1652. Das Clipping sollte aus Sicherheitsgründen immer eingeschaltet werden, da die
  1653. Ausgaberoutinen beim Überschreiten der Bildschirmgrenzen sehr schnell gro₧e
  1654. Speicherbereiche überschreiben, was zu unerfreulichen Abtürzen und Datenmüll
  1655. führen kann.
  1656.  
  1657. Wenn der Arbeitsbereich den ganzen Bildschirm einbeziehen soll, ist es  ratsam,
  1658. bei vs_clip() die bei v_opnvwk() erhaltenen Bildschirmausma₧e einzustellen.
  1659.  
  1660.  
  1661.  
  1662.  
  1663. Linien und nicht gefüllte Grafikprimitive
  1664. =========================================
  1665.  
  1666. ∙ POLYLINE (VDI 6)
  1667.  
  1668. "POLYLINE" zeichnet einen Linienzug. Alle angegebenen Punkte werden nacheinander
  1669. mit Linien verbunden. Es müssen mindestens zwei Koordinatenpaare übergeben
  1670. werden.
  1671.  
  1672. Dekl.:  void v_pline( WORD handle, WORD count, WORD *xyarr );
  1673. Aufruf: v_pline( handle, count, xyarr );
  1674.  
  1675. Variable         Belegung            Bedeutung
  1676. Eingaben:
  1677.  
  1678. contrl[0]        6                   v_pline
  1679. contrl[1]        n                   Einträge in ptsin
  1680. contrl[3]        0                   Einträge in intin
  1681. contrl[6]        handle
  1682. ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten
  1683.  
  1684. Ausgaben:
  1685.  
  1686. contrl[2]        0                   Einträge in ptsout
  1687. contrl[4]        0                   Einträge in intout
  1688.  
  1689.  
  1690. ∙ OUTPUT BEZIER (VDI 6, 13)
  1691.  
  1692. Diese Funktion zeichnet eine ungefüllte Bezierkurve.
  1693.  
  1694. Dekl.:  void v_bez( WORD handle, WORD count, WORD *xyarr, char *bezarr,
  1695.                     WORD *extent,int *totpts, WORD *totmoves );
  1696.  
  1697. Aufruf: v_bez( handle, count, xyarr, bezarr, extent, totpts, totmoves );
  1698.  
  1699. Variable         Belegung            Bedeutung
  1700. Eingaben:
  1701.  
  1702. contrl[0]        6                   v_bez
  1703. contrl[1]        n                   Einträge in ptsin
  1704. contrl[3]        (n+1)/2             Einträge in intin
  1705. contrl[5]        13                  signalisiert v_bez
  1706. contrl[6]        handle
  1707. ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten
  1708. intin[0..(n+1)/2-1] bezarr[0..n-1]   Punkttypen
  1709.  
  1710. Ausgaben:
  1711.  
  1712. contrl[2]        2                   Einträge in ptsout
  1713. contrl[4]        6                   Einträge in intout
  1714.  
  1715. intout[0]        totpts              Anzahl der berechneten Punkte
  1716. intout[1]        totmoves            Anzahl der Unterbrechungen im Linienzug
  1717. intout[2..5]                         reserviert
  1718. ptsout[0..3]     extent[0..3]        Koordinaten des umschlie₧enden Rechtecks
  1719.  
  1720. Bedeutung der Punkttypen:
  1721. Bit 0:   Startpunkt eines 4-Punkte Beziersegments (2 Ankerpunkte und zwei
  1722.          Richtungspunkte). Der Endpunkt eines Beziersegments kann auch der
  1723.          Startpunkt des nächsten Beziers sein - er kann aber kein "jump point"
  1724.          sein.
  1725.  
  1726. Bit 1:   "jump point". Dieser Punkt und der vorhergehende werden nicht
  1727.          verbunden. Nützlich um Enklaven oder Exklaven zu zeichnen.
  1728.  
  1729. Bit 2-7 sind undefiniert. Ist im Punkttyp Bit 0 gelöscht, verhält sich die
  1730. Bezierfunktion wie "POLYLINE" mit der Erweiterung, über den "jump point"
  1731. Enklaven oder Exklaven zeichnen zu können.
  1732.  
  1733. Bemerkung:
  1734. Die im Byte-Array bezarr übergebenen Punkttypen müssen vom C-Binding vertauscht
  1735. werden, da diese Funktion leider diesbezüglich kompatibel zum PC-GEM ist.
  1736. bezarr[0] wird ins Low-Byte von intin[0] und bezarr[1] ins High-Byte von
  1737. intin[0] geschrieben.
  1738.  
  1739.  
  1740. ∙ ARC (VDI 11, GDP 2)
  1741.  
  1742. "ARC" zeichnet einen Kreisbogen, dessen Start- und Endwinkel in 1/10 Grad von 0
  1743. bis 3600 angegeben werden.
  1744.  
  1745. Dekl.:  void v_arc( WORD handle, WORD x, WORD y, WORD radius,
  1746.                     WORD begang, WORD endang );
  1747. Aufruf: v_arc( handle, x, y, radius, begang, endang );
  1748.  
  1749. Variable         Belegung            Bedeutung
  1750. Eingaben:
  1751.  
  1752. contrl[0]        11                  GDP
  1753. contrl[1]        4                   Einträge in ptsin
  1754. contrl[3]        2                   Einträge in intin
  1755. contrl[5]        2                   v_arc
  1756. contrl[6]        handle
  1757. intin[0]         begang              Startwinkel
  1758. intin[1]         endang              Endwinkel
  1759. ptsin[0]         x
  1760. ptsin[1]         y
  1761. ptsin[6]         radius              Radius
  1762.  
  1763. Ausgaben:
  1764.  
  1765. contrl[2]        0                   Einträge in ptsout
  1766. contrl[4]        0                   Einträge in intout
  1767.  
  1768.  
  1769. ∙ ELLIPTICAL ARC (VDI 11, GDP 6)
  1770.  
  1771. "ELLIPTICAL ARC" zeichnet einen Ellipsenbogenausschnitt. Die Winkelangabe
  1772. erfolgt in 1/10 Grad von 0 bis 3600.
  1773.  
  1774. Dekl.:  void v_ellarc( WORD handle, WORD x, WORD y, WORD x_radius,
  1775.                        WORD y_radius, WORD begang, WORD endang );
  1776. Aufruf: v_ellarc( handle, x, y, x_radius, y_radius, begang, endang );
  1777.  
  1778. Variable         Belegung            Bedeutung
  1779. Eingaben:
  1780.  
  1781. contrl[0]        11                  GDP
  1782. contrl[1]        2                   Einträge in ptsin
  1783. contrl[3]        2                   Einträge in intin
  1784. contrl[5]        6                   v_ellarc
  1785. contrl[6]        handle
  1786. intin[0]         begang              Startwinkel
  1787. intin[1]         endang              Endwinkel
  1788. ptsin[0]         x
  1789. ptsin[1]         y
  1790. ptsin[2]         xradius             Radius in horizontaler Richtung
  1791. ptsin[3]         yradius             Radius in vertikaler Richtung
  1792.  
  1793. Ausgaben:
  1794.  
  1795. contrl[2]        0                   Einträge in ptsout
  1796. contrl[4]        0                   Einträge in intout
  1797.  
  1798.  
  1799. ∙ ROUNDED RECTANGLE (VDI 11, GDP 8)
  1800.  
  1801. Ein Rechteck mit gerundeten Ecken wird gezeichnet.
  1802.  
  1803. Dekl.:  void v_rbox( WORD handle, WORD *rect );
  1804. Aufruf: v_rbox( handle, rect );
  1805.  
  1806. Variable         Belegung            Bedeutung
  1807. Eingaben:
  1808.  
  1809. contrl[0]        11                  GDP
  1810. contrl[1]        2                   Einträge in ptsin
  1811. contrl[3]        0                   Einträge in intin
  1812. contrl[5]        8                   v_rbox
  1813. contrl[6]        handle
  1814. ptsin[0..3]      rect[0..3]          Koordinaten
  1815.  
  1816. Ausgaben:
  1817.  
  1818. contrl[2]        0                   Einträge in ptsout
  1819. contrl[4]        0                   Einträge in intout
  1820.  
  1821.  
  1822. ∙ ENABLE BEZIER CAPABILITIES (VDI 11, GDP 13)
  1823.  
  1824. Diese Funktion ist aus Kompatibilitätsgründen vorhanden. Sie sorgt dafür, da₧
  1825. Aufrufe von v_pline() ohne die Unterfunktionsnummer 13 als Aufrufe von v_bez()
  1826. und Aufrufe von v_fillarea() ohne die Unterfunktiosnummer als Aufrufe von
  1827. v_bez_fill() aufgefa₧t werden. v_bez_on() wird normalerweise nur verwendet, um
  1828. festzustellen, ob Beziers vorhanden sind - in diesem Fall ist retval ungleich 0
  1829. (vorher sollte man intout[0] auf 0 setzen!).
  1830.  
  1831. Dekl.:  WORD v_bez_on( WORD handle );
  1832. Aufruf: retval = v_bez_on( handle );
  1833.  
  1834. Variable         Belegung         Bedeutung
  1835. Eingaben:
  1836.  
  1837. contrl[0]        11               GDP
  1838. contrl[1]        1                Einträge in ptsin - signalisiert v_bez_on
  1839. contrl[3]        0                Einträge in intin
  1840. contrl[5]        13               v_bez_on
  1841. contrl[6]        handle
  1842.  
  1843. Ausgaben:
  1844.  
  1845. intout[0]        retval           Beziertiefe
  1846.  
  1847. Bedeutung von retval:
  1848. <retval> kann einen Wert von 0 (keine Beziers) bis 7 (maximale Qualität)
  1849. annehmen, der ein ungefähres Ma₧ für die Kurvenqualität darstellt -
  1850. normalerweise kann man von diesem Wert nur ableiten, ob Beziers vorhanden sind.
  1851.  
  1852.  
  1853. ∙ DISABLE BEZIER CAPABILITIES (VDI 11, GDP 13)
  1854.  
  1855. Diese Funktion ist aus Kompatibilitätsgründen vorhanden. Sie schaltet die
  1856. Sonderbehandlung für v_bez() und v_bez_fill() aus.
  1857.  
  1858. Dekl.:  void v_bez_off( WORD handle );
  1859. Aufruf: v_bez_off( handle );
  1860.  
  1861. Variable         Belegung         Bedeutung
  1862. Eingaben:
  1863.  
  1864. contrl[0]        11               GDP
  1865. contrl[1]        0                Einträge in ptsin - signalisiert v_bez_off
  1866. contrl[3]        0                Einträge in intin
  1867. contrl[5]        13               v_bez_off
  1868. contrl[6]        handle
  1869.  
  1870. Ausgaben:
  1871.  
  1872. -
  1873.  
  1874.  
  1875. ∙ SET BEZIER QUALITY (VDI 5, ESCAPE 99)
  1876.  
  1877. Mit dieser Funktion wird die Qualität der Bezierfunktionen eingestellt. Die
  1878. Qualität kann in Prozent von 0 - 100 eingestellt werden.
  1879.  
  1880. Dekl.:  WORD v_bez_qual( WORD handle, WORD qual, WORD *set_qual );
  1881. Aufruf: v_bez_qual( handle, qual, &set_qual );
  1882.  
  1883. Variable         Belegung            Bedeutung
  1884. Eingaben:
  1885.  
  1886. contrl[0]        5                   ESCAPE
  1887. contrl[1]        0                   Einträge in ptsin
  1888. contrl[3]        3                   Einträge in intin
  1889. contrl[5]        99
  1890. contrl[6]        handle
  1891. intin[0]         32                  intin[0..1] signaliseren v_bez_qual()
  1892. intin[1]         1
  1893. intin[2]         qual                gewünschte Bezierqualität in Prozent
  1894.  
  1895. Ausgaben:
  1896.  
  1897. contrl[2]        0                   Einträge in ptsout
  1898. contrl[4]        1                   Einträge in intout
  1899. intout[0]        set_qual            eingestellte Bezierqualität in Prozent
  1900.  
  1901.  
  1902. ∙ SET POLYLINE LINE TYPE (VDI 15)
  1903.  
  1904. Mit "SET POLYLINE LINE TYPE" kann man den Linientyp festlegen. Wenn der
  1905. gewünschte Linientyp nicht einstellbar ist, wird der Linientyp 1 (durchgehende
  1906. Linie) eingestellt.
  1907.  
  1908. Dekl.:  WORD vsl_type( WORD handle, WORD type );
  1909. Aufruf: set_type = vsl_type( handle, type );
  1910.  
  1911. Variable         Belegung            Bedeutung
  1912. Eingaben:
  1913.  
  1914. contrl[0]        15                  vsl_type
  1915. contrl[1]        0                   Einträge in ptsin
  1916. contrl[3]        1                   Einträge in intin
  1917. contrl[6]        handle
  1918. intin[0]         type                gewünschter Linientyp
  1919.  
  1920. Ausgaben:
  1921.  
  1922. contrl[2]        0                   Einträge in ptsout
  1923. contrl[4]        1                   Einträge in intout
  1924. intout[0]        set_type            ausgewählter Linientyp
  1925.  
  1926. Bedeutung von type:
  1927. 1: %1111111111111111  (durchgehende Linie)
  1928. 2: %1111111111110000  (langer Strich)
  1929. 3: %1110000011100000  (Punkte)
  1930. 4: %1111111100011000  (Strich, Punkt)
  1931. 5: %1111111100000000  (Strich)
  1932. 6: %1111000110011000  (Strich, Punkt, Punkt)
  1933. 7: benutzerdefiniert über vsl_udsty()
  1934.  
  1935.  
  1936. ∙ SET POLYLINE LINE WIDTH (VDI 16)
  1937.  
  1938. Diese Funktion setzt die Linienbreite, wobei nur ungerade Werte eingestellt
  1939. werden (ggf. wird auf den nächstkleineren Wert gerundet). Linien die breiter als
  1940. 1 Pixel sind werden von den meisten Treibern nur ohne Muster gezeichnet.
  1941.  
  1942. Dekl.:  WORD vsl_width( WORD handle, WORD width );
  1943. Aufruf: set_width = vsl_width( handle, width );
  1944.  
  1945. Variable         Belegung            Bedeutung
  1946. Eingaben:
  1947.  
  1948. contrl[0]        16                  vsl_width
  1949. contrl[1]        1                   Einträge in ptsin
  1950. contrl[3]        0                   Einträge in intin
  1951. contrl[6]        handle
  1952. ptsin[0]         width               gewünschte Linienbreite
  1953.  
  1954. Ausgaben:
  1955.  
  1956. contrl[2]        1                   Einträge in ptsout
  1957. contrl[4]        0                   Einträge in intout
  1958. ptsout[0]        set_width           ausgewählte Linienbreite
  1959.  
  1960. Bemerkung:
  1961. Die Linienbreite orientiert sich immer an der horizontalen Pixelgrö₧e.
  1962.  
  1963.  
  1964. ∙ SET POLYLINE COLOR INDEX (VDI 17)
  1965.  
  1966. Der Farbindex für Linien wird gesetzt. Bei ungültigem Index wird der Farbindex 1
  1967. gesetzt.
  1968.  
  1969. Dekl.:  WORD vsl_color( WORD handle, WORD color_index );
  1970. Aufruf: set_color = vsl_color( handle, color_index );
  1971.  
  1972. Variable         Belegung            Bedeutung
  1973. Eingaben:
  1974.  
  1975. contrl[0]        17                  vsl_color
  1976. contrl[1]        0                   Einträge in ptsin
  1977. contrl[3]        1                   Einträge in intin
  1978. contrl[6]        handle
  1979. intin[0]         color_index         gewünschte Linienfarbe
  1980.  
  1981. Ausgaben:
  1982.  
  1983. contrl[2]        0                   Einträge in ptsout
  1984. contrl[4]        1                   Einträge in intout
  1985. intout[0]        set_color           ausgewählte Linienfarbe
  1986.  
  1987.  
  1988. ∙ INQUIRE CURRENT POLYLINE ATTRIBUTES (VDI 35)
  1989.  
  1990. Diese Funktion gibt die aktuellen Linienattribute zurück.
  1991.  
  1992. Dekl.:  void vql_attributes( WORD handle, WORD *attrib );
  1993. Aufruf: vql_attributes( handle, attrib );
  1994.  
  1995. Variable         Belegung            Bedeutung
  1996. Eingaben:
  1997.  
  1998. contrl[0]        35                  vql_attributes
  1999. contrl[1]        0                   Einträge in ptsin
  2000. contrl[3]        0                   Einträge in intin
  2001. contrl[6]        handle
  2002.  
  2003. Ausgaben:
  2004.  
  2005. contrl[2]        1                   Einträge in ptsout
  2006. contrl[4]        5                   Einträge in intout
  2007. intout[0]        attrib[0]           Linientyp
  2008. intout[1]        attrib[1]           Linienfarbe
  2009. intout[2]        attrib[2]           Schreibmodus
  2010. intout[3]        attrib[4]           Linienanfangsform
  2011. intout[4]        attrib[5]           Linienendform
  2012. ptsout[0]        attrib[3]           Linienbreite
  2013.  
  2014.  
  2015. ∙ SET POLYLINE END STYLES (VDI 108)
  2016.  
  2017. Das Aussehen der Linienenden wird mit "SET POLYLINE END STYLES" bestimmt. Bei
  2018. ungültigen Angaben wird das betreffende Linienende eckig.
  2019.  
  2020. Dekl.:  void vsl_ends( WORD handle, WORD beg_style, WORD end_style );
  2021. Aufruf: vsl_ends( handle, beg_style, end_style );
  2022.  
  2023. Variable         Belegung            Bedeutung
  2024. Eingaben:
  2025.  
  2026. contrl[0]        108                 vsl_ends
  2027. contrl[1]        0                   Einträge in ptsin
  2028. contrl[3]        2                   Einträge in intin
  2029. contrl[6]        handle
  2030. intin[0]         beg_style           Aussehen des Linienanfangs
  2031. intin[1]         end_style           Aussehen des Linienendes
  2032.  
  2033. Ausgaben:
  2034.  
  2035. contrl[2]        0                   Einträge in ptsout
  2036. contrl[4]        0                   Einträge in intout
  2037.  
  2038. Bedeutung von beg_style und end_style:
  2039. 0: eckig
  2040. 1: Pfeil
  2041. 2: abgerundet
  2042.  
  2043.  
  2044. ∙ SET USER-DEFINED LINE STYLE PATTERN (VDI 113)
  2045.  
  2046. Mit dieser Funktion legt man den benutzerdefinierten Linientyp von "SET POLYLINE
  2047. LINE TYPE" fest.
  2048.  
  2049. Dekl.:  void vsl_udsty( WORD handle, WORD pattern );
  2050. Aufruf: vsl_udsty( handle, pattern );
  2051.  
  2052. Variable         Belegung            Bedeutung
  2053. Eingaben:
  2054.  
  2055. contrl[0]        113                 vsl_udsty
  2056. contrl[1]        0                   Einträge in ptsin
  2057. contrl[3]        1                   Einträge in intin
  2058. contrl[6]        handle
  2059. intin[0]         pattern             benutzerdefiniertes Linienmuster
  2060.  
  2061. Ausgaben:
  2062.  
  2063. contrl[2]        0                   Einträge in ptsout
  2064. contrl[4]        0                   Einträge in intout
  2065.  
  2066.  
  2067.  
  2068.  
  2069. Gefüllte Grafikprimitive
  2070. ========================
  2071.  
  2072. ∙ FILLED AREA (VDI 9)
  2073.  
  2074. Durch "FILLED AREA" wird eine beliebige, gefüllte Fläche gezeichnet.
  2075.  
  2076. Dekl.:  void v_fillarea( WORD handle, WORD count, WORD *xyarr );
  2077. Aufruf: v_fillarea( handle, count, xyarr );
  2078.  
  2079. Variable         Belegung            Bedeutung
  2080. Eingaben:
  2081.  
  2082. contrl[0]        9                   v_fillarea
  2083. contrl[1]        n                   Einträge in ptsin
  2084. contrl[3]        0                   Einträge in intin
  2085. contrl[6]        handle
  2086. ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten
  2087.  
  2088. Ausgaben:
  2089.  
  2090. contrl[2]        0                   Einträge in ptsout
  2091. contrl[4]        0                   Einträge in intout
  2092.  
  2093.  
  2094. ∙ OUTPUT FILLED BEZIER (VDI 9, 13)
  2095.  
  2096. Diese Funktion zeichnet eine gefüllte Bezierkurve.
  2097.  
  2098. Dekl.:  void v_bez_fill( WORD handle, WORD count, WORD *xyarr, char *bezarr,
  2099.                          WORD *extent,int *totpts, WORD *totmoves );
  2100. Aufruf: v_bez_fill( handle, count, xyarr, bezarr, extent, totpts, totmoves );
  2101.  
  2102. Variable         Belegung            Bedeutung
  2103. Eingaben:
  2104.  
  2105. contrl[0]        9                   v_bez_fill
  2106. contrl[1]        n                   Einträge in ptsin
  2107. contrl[3]        (n+1)/2             Einträge in intin
  2108. contrl[5]        13                  signalisiert v_bez_fill
  2109. contrl[6]        handle
  2110. ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten
  2111. intin[0..(n+1)/2-1] bezarr[0..n-1]   Punkttypen
  2112.  
  2113. Ausgaben:
  2114.  
  2115. contrl[2]        2                   Einträge in ptsout
  2116. contrl[4]        6                   Einträge in intout
  2117. intout[0]        totpts              Anzahl der berechneten Punkte
  2118. intout[1]        totmoves            Anzahl der Unterbrechungen im Linienzug
  2119. intout[2..5]                         reserviert
  2120. ptsout[0..3]     extent[0..3]        Koordinaten des umschlie₧enden Rechtecks
  2121.  
  2122. Bedeutung der Punkttypen:
  2123. Bit 0:   Startpunkt eines 4-Punkte Beziersegments (2 Ankerpunkte und zwei
  2124.          Richtungspunkte). Der Endpunkt eines Beziersegments kann auch der
  2125.          Startpunkt des nächsten Beziers sein - er kann aber kein "jump point"
  2126.          sein.
  2127.  
  2128. Bit 1:   "jump point". Dieser Punkt und der vorhergehende werden nicht
  2129.          verbunden. Nützlich um Enklaven oder Exklaven zu zeichnen.
  2130.  
  2131. Bit 2-7 sind undefiniert. Ist im Punkttyp Bit 0 gelöscht, verhält sich die
  2132. Bezierfunktion wie "FILLED AREA" mit der Erweiterung, über den "jump point"
  2133. Enklaven oder Exklaven zeichnen zu können.
  2134.  
  2135. Bemerkung:
  2136. Die im Byte-Array bezarr übergebenen Punkttypen müssen vom C-Binding vertauscht
  2137. werden, da diese Funktion leider diesbezüglich kompatibel zum PC-GEM ist.
  2138. bezarr[0] wird ins Low-Byte von intin[0] und bezarr[1] ins High-Byte von
  2139. intin[0] geschrieben.
  2140.  
  2141.  
  2142. ∙ BAR (VDI 11, GDP 1)
  2143.  
  2144. Von dieser Funktion wird ein ausgefülltes Rechteck gezeichnet. Im Gegensatz zu
  2145. "FILLED RECTANGLE" wird eine Umrahmung ausgegeben.
  2146.  
  2147. Dekl.:  void v_bar( WORD handle, WORD *rect );
  2148. Aufruf: v_bar( handle, rect );
  2149.  
  2150. Variable         Belegung            Bedeutung
  2151. Eingaben:
  2152.  
  2153. contrl[0]        11                  GDP
  2154. contrl[1]        2                   Einträge in ptsin
  2155. contrl[3]        0                   Einträge in intin
  2156. contrl[5]        1                   v_bar
  2157. contrl[6]        handle
  2158. ptsin[0..3]      rect[0..3]          Koordinaten des Rechtecks
  2159.  
  2160. Ausgaben:
  2161.  
  2162. contrl[2]        0                   Einträge in ptsout
  2163. contrl[4]        0                   Einträge in intout
  2164.  
  2165.  
  2166. ∙ PIE (VDI 11, GDP 3)
  2167.  
  2168. Diese Funktion zeichnet einen Kreisflächenausschnitt. Die Winkel werden in
  2169. 1/10 Grad von 0 bis 3600 angegeben.
  2170.  
  2171. Dekl.:  void v_pieslice( WORD handle, WORD x, WORD y, WORD radius,
  2172.                          WORD begang, WORD endang );
  2173. Aufruf: v_pieslice( handle, x, y, radius, begang, endang );
  2174.  
  2175. Variable         Belegung            Bedeutung
  2176. Eingaben:
  2177.  
  2178. contrl[0]        11                  GDP
  2179. contrl[1]        4                   Einträge in ptsin
  2180. contrl[3]        2                   Einträge in intin
  2181. contrl[5]        3                   v_pieslice
  2182. contrl[6]        handle
  2183. intin[0]         begang              Startwinkel
  2184. intin[1]         endang              Endwinkel
  2185. ptsin[0]         x
  2186. ptsin[1]         y
  2187. ptsin[6]         radius              Radius
  2188.  
  2189. Ausgaben:
  2190.  
  2191. contrl[2]        0                   Einträge in ptsout
  2192. contrl[4]        0                   Einträge in intout
  2193.  
  2194.  
  2195. ∙ CIRCLE (VDI 11, GDP 4)
  2196.  
  2197. Die Funktion "CIRCLE" zeichnet eine Kreisfläche.
  2198.  
  2199. Dekl.:  void v_circle( WORD handle, WORD x, WORD y, WORD radius );
  2200. Aufruf: v_circle( handle, x, y, radius );
  2201.  
  2202. Variable         Belegung            Bedeutung
  2203. Eingaben:
  2204.  
  2205. contrl[0]        11                  GDP
  2206. contrl[1]        3                   Einträge in ptsin
  2207. contrl[3]        2                   Einträge in intin
  2208. contrl[5]        4                   v_circle
  2209. contrl[6]        handle
  2210. intin[0]         begang              Startwinkel
  2211. intin[1]         endang              Endwinkel
  2212. ptsin[0]         x
  2213. ptsin[1]         y
  2214. ptsin[4]         radius              Radius
  2215.  
  2216. Ausgaben:
  2217.  
  2218. contrl[2]        0                   Einträge in ptsout
  2219. contrl[4]        0                   Einträge in intout
  2220.  
  2221.  
  2222. ∙ ELLIPSE (VDI 11, GDP 5)
  2223.  
  2224. Diese Funktion zeichnet eine Ellipsenfläche.
  2225.  
  2226. Dekl.:  void v_ellipse( WORD handle, WORD x, WORD y,
  2227.                         WORD x_radius, WORD y_radius  );
  2228. Aufruf: v_ellipse( handle, x, y, x_radius, y_radius );
  2229.  
  2230. Variable         Belegung            Bedeutung
  2231. Eingaben:
  2232.  
  2233. contrl[0]        11                  GDP
  2234. contrl[1]        2                   Einträge in ptsin
  2235. contrl[3]        0                   Einträge in intin
  2236. contrl[5]        5                   v_ellipse
  2237. contrl[6]        handle
  2238. ptsin[0]         x
  2239. ptsin[1]         y
  2240. ptsin[2]         x_radius            Radius in horizontaler Richtung
  2241. ptsin[3]         y_radius            Radius in vertikaler Richtung
  2242.  
  2243. Ausgaben:
  2244.  
  2245. contrl[2]        0                   Einträge in ptsout
  2246. contrl[4]        0                   Einträge in intout
  2247.  
  2248.  
  2249. ∙ ELLIPTICAL PIE (VDI 11, GDP 7)
  2250.  
  2251. Die Funktion "ELLIPTICAL PIE" zeichnet einen Ellipsenflächenausschnitt. Die
  2252. Angabe der Winkel geschieht in Zehntelgrad von 0 bis 3600.
  2253.  
  2254. Dekl.:  void v_ellpie( WORD handle, WORD x, WORD y, WORD x_radius,
  2255.                        WORD y_radius, WORD begang, WORD endang );
  2256. Aufruf: v_ellpie( handle, x, y, x_radius, y_radius, begang, endang );
  2257.  
  2258. Variable         Belegung            Bedeutung
  2259. Eingaben:
  2260.  
  2261. contrl[0]        11                  GDP
  2262. contrl[1]        2                   Einträge in ptsin
  2263. contrl[3]        2                   Einträge in intin
  2264. contrl[5]        7                   v_ellpie
  2265. contrl[6]        handle
  2266. intin[0]         begang              Startwinkel
  2267. intin[1]         endang              Endwinkel
  2268. ptsin[0]         x
  2269. ptsin[1]         y
  2270. ptsin[2]         x_radius            Radius in horizontaler Richtung
  2271. ptsin[3]         y_radius            Radius in vertikaler Richtung
  2272.  
  2273. Ausgaben:
  2274.  
  2275. contrl[2]        0                   Einträge in ptsout
  2276. contrl[4]        0                   Einträge in intout
  2277.  
  2278.  
  2279. ∙ FILLED ROUNDED RECTANGLE (VDI 11, GDP 9)
  2280.  
  2281. Diese Funktion zeichnet ein ausgefülltes, abgerundetes Reckteck.
  2282.  
  2283. Dekl.:  void v_rfbox( WORD handle, WORD *rect );
  2284. Aufruf: v_rfbox( handle, rect );
  2285.  
  2286. Variable         Belegung            Bedeutung
  2287. Eingaben:
  2288.  
  2289. contrl[0]        11                  GDP
  2290. contrl[1]        2                   Einträge in ptsin
  2291. contrl[3]        0                   Einträge in intin
  2292. contrl[5]        9                   v_rfbox
  2293. contrl[6]        handle
  2294. ptsin[0..3]      rect[0..3]          Koordinaten
  2295.  
  2296. Ausgaben:
  2297.  
  2298. contrl[2]        0                   Einträge in ptsout
  2299. contrl[4]        0                   Einträge in intout
  2300.  
  2301.  
  2302. ∙ SET FILL INTERIOR INDEX (VDI 23)
  2303.  
  2304. Der  Fülltyp  kann  mit  dieser Funktion ausgewählt werden. Bei Übergabe eines
  2305. ungültigem Fülltyps wird der Typ 0 (leer) eingestellt.
  2306.  
  2307. Dekl.:  WORD vsf_interior( WORD handle, WORD interior );
  2308. Aufruf: set_interior = vsf_interior( handle, interior );
  2309.  
  2310. Variable         Belegung            Bedeutung
  2311. Eingaben:
  2312.  
  2313. contrl[0]        23                  vsf_interior
  2314. contrl[1]        0                   Einträge in ptsin
  2315. contrl[3]        1                   Einträge in intin
  2316. contrl[6]        handle
  2317. intin[0]         interior             gewünschter Fülltyp
  2318.  
  2319. Ausgaben:
  2320.  
  2321. contrl[2]        0                   Einträge in ptsout
  2322. contrl[4]        1                   Einträge in intout
  2323. intout[0]        set_interior        ausgewählter Fülltyp
  2324.  
  2325. Bedeutung von interior:
  2326. 0: leer
  2327. 1: voll
  2328. 2: gemustert
  2329. 3: schraffiert
  2330. 4: benutzerdefiniert
  2331.  
  2332.  
  2333. ∙ SET FILL STYLE INDEX (VDI 24)
  2334.  
  2335. Mit dieser Funktion wird der zum Fülltyp gehörende Füllindex gesetzt.
  2336.  
  2337. Dekl.:  WORD vsf_style( WORD handle, WORD style_index );
  2338. Aufruf: set_style = vsf_style( handle, style_index );
  2339.  
  2340. Variable         Belegung            Bedeutung
  2341. Eingaben:
  2342.  
  2343. contrl[0]        24                  vsf_style
  2344. contrl[1]        0                   Einträge in ptsin
  2345. contrl[3]        1                   Einträge in intin
  2346. contrl[6]        handle
  2347. intin[0]         style_index         gewünschter Füllindex
  2348.  
  2349. Ausgaben:
  2350.  
  2351. contrl[2]        0                   Einträge in ptsout
  2352. contrl[4]        1                   Einträge in intout
  2353. intout[0]        set_sytle           ausgewählter Füllindex
  2354.  
  2355.  
  2356. ∙ SET FILL COLOR INDEX (VDI 25)
  2357.  
  2358. Der Farbindex für Füllmuster wird mit dieser Funktion ausgewählt. Bei einem
  2359. ungültigen Index wird Farbindex 1 eingestellt. Der Farbindex hat keine
  2360. Auswirkung auf mehrfarbige Muster (siehe auf vsf_udpat); er sollte hier auf 1
  2361. gesetzt werden.
  2362.  
  2363. Dekl.:  WORD vsf_color( WORD handle, WORD color_index );
  2364. Aufruf: set_color = vsf_color( handle, color_index );
  2365.  
  2366. Variable         Belegung            Bedeutung
  2367. Eingaben:
  2368.  
  2369. contrl[0]        25                  vsf_color
  2370. contrl[1]        0                   Einträge in ptsin
  2371. contrl[3]        1                   Einträge in intin
  2372. contrl[6]        handle
  2373. intin[0]         color_index         gewünschter Farbindex
  2374.  
  2375. Ausgaben:
  2376.  
  2377. contrl[2]        0                   Einträge in ptsout
  2378. contrl[4]        1                   Einträge in intout
  2379. intout[0]        set_color           ausgewählter Farbindex
  2380.  
  2381.  
  2382. ∙ INQUIRE CURRENT FILL AREA ATTRIBUTES (VDI 37)
  2383.  
  2384. Diese Funktion gibt Auskunft über die aktuellen Füllattribute.
  2385.  
  2386. Dekl.:  void vqf_attributes( WORD handle, WORD *attrib );
  2387. Aufruf: vqf_attributes( handle, attrib );
  2388.  
  2389. Variable         Belegung            Bedeutung
  2390. Eingaben:
  2391.  
  2392. contrl[0]        37                  vqm_attributes
  2393. contrl[1]        0                   Einträge in ptsin
  2394. contrl[3]        0                   Einträge in intin
  2395. contrl[6]        handle
  2396.  
  2397. Ausgaben:
  2398.  
  2399. contrl[2]        0                   Einträge in ptsout
  2400. contrl[4]        5                   Einträge in intout
  2401. intout[0]        attrib[0]           Fülltyp
  2402. intout[1]        attrib[1]           Füllfarbe
  2403. intout[2]        attrib[2]           Füllmusterindex
  2404. intout[3]        attrib[3]           Schreibmodus
  2405. intout[4]        attrib[4]           Umrahmungs-Flag
  2406.  
  2407.  
  2408. ∙ CONTOUR FILL (VDI 103)
  2409.  
  2410. Diese Funktion füllt vom Startpunkt aus eine Fläche, wobei diese Fläche durch
  2411. den Bildrand oder eine andere Farbe begrenzt wird. Gerätetreiber, die mit einer
  2412. Display-List arbeiten (Druckertreiber, IMG-Treiber,...) unterstützen
  2413. v_contourfill() nicht oder können sie nur dann ausführen, wenn genügend Speicher
  2414. vorhanden ist.
  2415.  
  2416. Dekl.:  void v_contourfill( WORD handle, WORD x, WORD y, WORD color_index );
  2417. Aufruf: v_contourfill( handle, x, y, color_index );
  2418.  
  2419. Variable         Belegung            Bedeutung
  2420. Eingaben:
  2421.  
  2422. contrl[0]        103                 v_contourfill
  2423. contrl[1]        1                   Einträge in ptsin
  2424. contrl[3]        1                   Einträge in intin
  2425. contrl[6]        handle
  2426. intin[0]         color_index         Farbindex
  2427. ptsin[0]         x
  2428. ptsin[1]         y
  2429.  
  2430. Ausgaben:
  2431.  
  2432. contrl[2]        0                   Einträge in ptsout
  2433. contrl[4]        0                   Einträge in intout
  2434.  
  2435.  
  2436. ∙ SET FILL PERIMETER VISIBILITY (VDI 104)
  2437.  
  2438. Die  Umrahmung einer gefüllten Fläche (Rechteck, Polygon, Ellipse, ...) kann mit
  2439. dieser Funktion ein- oder ausgeschaltet werden.
  2440.  
  2441. Dekl.:  WORD vsf_perimeter( WORD handle, WORD flag );
  2442. Aufruf: set_perimeter = vsf_perimter( handle, flag );
  2443.  
  2444. Variable         Belegung            Bedeutung
  2445. Eingaben:
  2446.  
  2447. contrl[0]        104                 vsf_perimeter
  2448. contrl[1]        0                   Einträge in ptsin
  2449. contrl[3]        1                   Einträge in intin
  2450. contrl[6]        handle
  2451. intin[0]         flag                gewünschtes Umrahmungs-Flag
  2452.  
  2453. Ausgaben:
  2454.  
  2455. contrl[2]        0                   Einträge in ptsout
  2456. contrl[4]        1                   Einträge in intout
  2457. intout[0]        set_perimeter       ausgewähltes Umrahmungs-Flag
  2458.  
  2459. Bedeutung von flag:
  2460. 0: keine Umrahmung
  2461. 1: Umrahmung
  2462.  
  2463. ∙ SET USER-DEFINED FILL PATTERN (VDI 112)
  2464.  
  2465. Mit  "SET USER-DEFINED FILL PATTERN" kann ein  benutzerdefiniertes  Füllmuster
  2466. von 16*16 Pixel (16 Worte pro Musterebene) festgelegt werden. Mehrfarbige Muster
  2467. werden im Standardformat übergeben und müssen die gleiche Ebenenanzahl haben wie
  2468. der Bildschirm. Die Ausnahme von dieser Regel sind die Direct-RGB-Modi (mehr als
  2469. 8 Ebenen mit direkter RGB-Zuordnung) wie True-Color. Hier wird das Muster immer
  2470. als True-Color-Muster mit 32-Bit-Pixeln (xRGB) übergeben.
  2471.  
  2472. Dekl.:  void vsf_udpat( WORD handle, WORD *pattern, WORD planes );
  2473. Aufruf: vsf_udpat( handle, pattern, planes );
  2474.  
  2475. Variable         Belegung            Bedeutung
  2476. Eingaben:
  2477.  
  2478. contrl[0]        112                 vsf_udpat
  2479. contrl[1]        0                   Einträge in ptsin
  2480. contrl[3]        16n                 Einträge in intin (Musterebenen*16)
  2481. contrl[6]        handle
  2482. intin[0..16n-1]  pattern[0..16n-1]   Musterebenen
  2483.  
  2484. Ausgaben:
  2485.  
  2486. contrl[2]        0                   Einträge in ptsout
  2487. contrl[4]        0                   Einträge in intout
  2488.  
  2489. Bemerkung:
  2490. Bei Mehrfarbmustern sollte man die Füllfarbe auf 1 setzen und als Schreibmodus
  2491. REPLACE anwählen.
  2492.  
  2493.  
  2494. ∙ FILLED RECTANGLE (VDI 114)
  2495.  
  2496. "FILLED RECTANGLE" zeichnet ein ausgefülltes Rechteck ohne Umrahmung.
  2497.  
  2498. Dekl.:  void vr_recfl( WORD handle, WORD *rect );
  2499. Aufruf: vr_recfl( handle, rect );
  2500.  
  2501. Variable         Belegung            Bedeutung
  2502. Eingaben:
  2503.  
  2504. contrl[0]        114                 vr_recfl
  2505. contrl[1]        2                   Einträge in ptsin
  2506. contrl[3]        0                   Einträge in intin
  2507. contrl[6]        handle
  2508. ptsin[0..3]      rect[0..3]          Koordinaten
  2509.  
  2510. Ausgaben:
  2511.  
  2512. contrl[2]        0                   Einträge in ptsout
  2513. contrl[4]        0                   Einträge in intout
  2514.  
  2515.  
  2516.  
  2517.  
  2518. Marker
  2519. ======
  2520.  
  2521. ∙ POLYMARKER (VDI 7)
  2522.  
  2523. Diese Funktion zeichnet Marker an den angegebenen Stellen.
  2524.  
  2525. Dekl.:  void v_pmarker( WORD handle, WORD count, WORD *xyarr );
  2526. Aufruf: v_pmarker( handle, count, xyarr );
  2527.  
  2528. Variable         Belegung            Bedeutung
  2529. Eingaben:
  2530.  
  2531. contrl[0]        7                   v_pmarker
  2532. contrl[1]        n                   Einträge in ptsin
  2533. contrl[3]        0                   Einträge in intin
  2534. contrl[6]        handle
  2535. ptsin[0..2n-1]   xyarr[0..2n-1]      Koordinaten
  2536.  
  2537. Ausgaben:
  2538.  
  2539. contrl[2]        0                   Einträge in ptsout
  2540. contrl[4]        0                   Einträge in intout
  2541.  
  2542.  
  2543. ∙ SET POLYMARKER TYPE (VDI 18)
  2544.  
  2545. Mit  dieser  Funktion  wird der gewünschte Marker  ausgewählt.  Im  Fall  einer
  2546. fehlerhaften Markernummer wird Markertyp 3 benutzt.
  2547.  
  2548. Dekl.:  WORD vsm_type( WORD handle, WORD type );
  2549. Aufruf: set_type = vsm_type( handle, type );
  2550.  
  2551. Variable         Belegung            Bedeutung
  2552. Eingaben:
  2553.  
  2554. contrl[0]        18                  vsm_type
  2555. contrl[1]        0                   Einträge in ptsin
  2556. contrl[3]        1                   Einträge in intin
  2557. contrl[6]        handle
  2558. intin[0]         type                gewünschter Markertyp
  2559.  
  2560. Ausgaben:
  2561.  
  2562. contrl[2]        0                   Einträge in ptsout
  2563. contrl[4]        1                   Einträge in intout
  2564. intout[0]        set_type            ausgewählter Markertyp
  2565.  
  2566. Bedeutung von type:
  2567. 1: Punkt
  2568. 2: Plus
  2569. 3: Sternchen
  2570. 4: Quadrat
  2571. 5: Kreuz
  2572. 6: Raute
  2573.  
  2574.  
  2575. ∙ SET POLYMARKER HEIGHT (VDI 19)
  2576.  
  2577. Die Markergrö₧e kann mittels "SET POLYMARKER HEIGHT" eingestellt werden. Falls
  2578. die eingestellte Höhe nicht existiert, wird die nächstkleinere Höhe eingestellt.
  2579. Der Markertyp 1 (Punkt) hat immer die Höhe 1.
  2580.  
  2581. Dekl.:  WORD vsm_height( WORD handle, WORD height );
  2582. Aufruf: set_height = vsm_height( handle, height );
  2583.  
  2584. Variable         Belegung            Bedeutung
  2585. Eingaben:
  2586.  
  2587. contrl[0]        19                  vsm_height
  2588. contrl[1]        1                   Einträge in ptsin
  2589. contrl[3]        0                   Einträge in intin
  2590. contrl[6]        handle
  2591. ptsin[1]         height              gewünschte Markerhöhe
  2592.  
  2593. Ausgaben:
  2594.  
  2595. contrl[2]        1                   Einträge in ptsout
  2596. contrl[4]        0                   Einträge in intout
  2597. ptsout[0]        set_width           ausgewählte Markerbreite
  2598. ptsout[1]        set_height          ausgewählte Markerhöhe
  2599.  
  2600.  
  2601. ∙ SET POLYMARKER COLOR INDEX (VDI 20)
  2602.  
  2603. Diese Funktion setzt den Farbindex der Marker. Bei ungültigem Index wird der
  2604. Farbindex 1 gesetzt.
  2605.  
  2606. Dekl.:  WORD vsm_color( WORD handle, WORD color_index );
  2607. Aufruf: set_color = vsm_color( handle, color_index );
  2608.  
  2609. Variable         Belegung            Bedeutung
  2610. Eingaben:
  2611.  
  2612. contrl[0]        20                  vsm_color
  2613. contrl[1]        0                   Einträge in ptsin
  2614. contrl[3]        1                   Einträge in intin
  2615. contrl[6]        handle
  2616. intin[0]         color_index         gewünschte Markerfarbe
  2617.  
  2618. Ausgaben:
  2619.  
  2620. contrl[2]        0                   Einträge in ptsout
  2621. contrl[4]        1                   Einträge in intout
  2622. intout[0]        set_color           ausgewählte Markerfarbe
  2623.  
  2624.  
  2625. ∙ INQUIRE CURRENT POLYMARKER ATTRIBUTES (VDI 36)
  2626.  
  2627. "INQUIRE CURRENT POLYMARKER ATTRIBUTES" gibt Auskunft über die eingestellten
  2628. Markerattribute.
  2629.  
  2630. Dekl.:  void vqm_attributes( WORD handle, WORD *attrib );
  2631. Aufruf: vqm_attributes( handle, attrib );
  2632.  
  2633. Variable         Belegung            Bedeutung
  2634. Eingaben:
  2635.  
  2636. contrl[0]        36                  vqm_attributes
  2637. contrl[1]        0                   Einträge in ptsin
  2638. contrl[3]        0                   Einträge in intin
  2639. contrl[6]        handle
  2640.  
  2641. Ausgaben:
  2642.  
  2643. contrl[2]        1                   Einträge in ptsout
  2644. contrl[4]        3                   Einträge in intout
  2645. intout[0]        attrib[0]           Markertyp
  2646. intout[1]        attrib[1]           Markerfarbe
  2647. intout[2]        attrib[2]           Schreibmodus
  2648. ptsout[0]        attrib[4]           Markerbreite
  2649. ptsout[1]        attrib[3]           Markerhöhe
  2650.  
  2651.  
  2652.  
  2653.  
  2654. Textausgaben mit Bitmap- und Vektorfonts
  2655. ========================================
  2656.  
  2657. Zunächst ein paar generelle Erklärungen und Anmerkungen zum Thema Text...
  2658.  
  2659. Font-ID und Index:
  2660.  
  2661. Der Index eines Fonts ist eine Zahl zwischen 1 und der verfügbaren Fontanzahl.
  2662. Je nach Anzahl der auf dem jeweiligen Rechner installierten Fonts hat ein Font
  2663. wie z.B. "Swiss 721" einen unterschiedlichen Index.
  2664. Die Font-ID ist dagegen eine Kennung, die grundsätzlich für einen Font
  2665. unabhängig vom System immer gleich ist - für "Swiss 721" z.B. 5003. Ausnahmen
  2666. von dieser Regel sind aber bei Fonts möglich, die keine verwendbare Font-ID
  2667. haben. In diesem Fall wird versucht, eine eindeutige ID zu erzeugen. Da es aber
  2668. möglich ist, da₧ eine derart erzeugte ID für einen Font nicht auf allen Systemen
  2669. identisch ist, sollten Programme für eine eindeutige Zuordnung des Fonts au₧er
  2670. der ID auch den Namen abspeichern.
  2671.  
  2672. Vektorfont oder Bitmap-Font?
  2673.  
  2674. Wenn es sich bei einem eingstellten Font um einen Vektorfont handelt, liefert
  2675. vqt_name() 34 Einträge in intout zurück und intout[33] enthält einen Wert
  2676. ungleich 0. Ist intout[33] 0 oder werden nur 33 Einträge zurückgeliefert,
  2677. handelt es sich um einen Bitmap-Font.
  2678.  
  2679. Äquidistante Fonts (monospaced):
  2680.  
  2681. Für manche Applikationen ist es zweckmä₧ig, bei der Ausgabe nur äquidistante
  2682. Fonts zu benutzen. Das sinnvollste Vorgehen dafür sieht wie folgt aus:
  2683.  
  2684. a) Wenn vqt_name() in erweiterter Form (35 Einträge in intout) vorhanden ist,
  2685.    sollte einfach das entsprechende Bit in intout[34] abgetestet werden.
  2686. b) Wenn vqt_name() nur die Information bietet, da₧ es sich um einen Vektorfont
  2687.    handelt (34 Einträge in intout, intout[33] != 0), sollte für Vektorfonts
  2688.    vqt_fontheader() aufgerufen und Bit 1 von FH_CLFGS geprüft werden.
  2689. c) Wenn es sich nicht um einen Vektorfont handelt und a) und b) nicht zutreffen,
  2690.    müssen die Zeichenbreiten einzeln mit vqt_width() erfragt und miteinander
  2691.    verglichen werden.
  2692.  
  2693. Wer äquidistante Vektorfonts mit v_ftext() ausgibt, darf als Breite nicht mit
  2694. den Ausgaben von vst_height() oder vqt_width() rechnen, sondern mu₧ sie bei
  2695. vqt_advance() erfragen, da bei v_ftext() immer mit Breiten in 1/65536 Pixeln
  2696. positioniert wird. Bei Ausgabe über v_gtext() sind die Rückgaben von vqt_width()
  2697. zutreffend.
  2698.  
  2699. Höhe und Breite von Vektorfonts:
  2700.  
  2701. Die Höhe und Breite eines Vektorfonts kann mit den Funktionen vst_arbpt() und
  2702. und vst_setsize() in 1/65536 pt eingestellt werden (1 pt ≈ 1/72 Zoll ≈ 353 µm).
  2703. Bei negativer Höhe oder Breite wird der Text an der jeweiligen Achse gespiegelt.
  2704.  
  2705. Pair- und Track-Kerning:
  2706.  
  2707. Sowohl Pair- als auch Track-Kerning sind nach dem Öffnen einer Workstation
  2708. ausgestellt. Um eine bessere Textdarstellung zu haben, sollte das Pair-Kerning
  2709. daher mit vst_kern() eingeschaltet werden.
  2710.  
  2711. Positionierung von Vektortext:
  2712.  
  2713. Bei der Ausgabe von Vektorfonts wird innerhalb des VDIs mit Schrittweiten von
  2714. 1/65536 Pixel Auflösung gerechnet, um unabhängig vom verwendeten Ausgabegerät
  2715. und dessen tatsächlicher Auflösung eine gleichbleibende Zeichenpositionierung zu
  2716. gewährleisten. Um die Bitmaps für die einzelnen Zeichen auszugeben, werden diese
  2717. Festkommawerte in Pixel umgerechnet, indem 32768 hinzuaddiert und anschlie₧end
  2718. durch 65536 geteilt wird.
  2719.  
  2720. Wenn das Track-Kerning eingeschaltet ist, wird zu jeder Zeichenposition der bei
  2721. vqt_trackkern() zu erfragende Offset addiert.
  2722.  
  2723. Bei eingeschaltetem Pair-Kerning wird zu jeder Zeichenposition der von
  2724. vqt_pairkern() zurückgelieferte Offset addiert.
  2725.  
  2726. Pair- und Track-Kerning und die Positionierung in 1/65536 Pixeln werden nur
  2727. eingesetzt, wenn v_ftext() aufgerufen wird! Bei v_gtext() verhalten sich
  2728. Vektorfonts weitgehend wie Bitmap-Fonts und weder Kerning noch genaue
  2729. Positionierung werden benutzt.
  2730.  
  2731. Grö₧e von Vektorfonts/Pixelgrö₧en:
  2732.  
  2733. Die meisten Bildschirmtreiber liefern eine Auflösung von ≈ 91 dpi zurück, nach
  2734. der sich auch die Grö₧e der Vektorfonts richtet. Da nicht bei jedem Schirm 91
  2735. dpi vorhanden sind, sollten Programme bei Textdarstellung auf dem Bildschirm
  2736. nicht fest mit diesem Wert rechnen, sondern die Ausgaben von v_opnwk(),
  2737. v_opnvwk(), vq_extnd() und v_opnbm() beachten. Andernfalls können bei
  2738. abweichenden Pixelgrö₧en Darstellungsfehler auftreten.
  2739. Beim Ausdruck sollten die genaueren Pixelgrö₧en bei vq_extnd() beachtet werden,
  2740. damit die Textpositionierung möglichst genau ist.
  2741.  
  2742.  
  2743. ∙ TEXT (VDI 8)
  2744.  
  2745. "TEXT" gibt eine Zeichenkette mit Attributen aus. Ist ein Vektorfont
  2746. eingestellt, so wird weder Pair- noch Track-Kerning beachtet. Die
  2747. Zeichenpositionierung erfolgt au₧erdem pixelweise, d.h. vqt_width() liefert
  2748. hierfür die passenden Schrittgrö₧en.
  2749.  
  2750. Dekl.:  void v_gtext( WORD handle, WORD x, WORD y, BYTE *string );
  2751. Aufruf: v_gtext( handle, x, y, string );
  2752.  
  2753. Variable         Belegung            Bedeutung
  2754. Eingaben:
  2755.  
  2756. contrl[0]        8                   v_gtext
  2757. contrl[1]        1                   Einträge in ptsin
  2758. contrl[3]        n                   Einträge in intin
  2759. contrl[6]        handle
  2760. intin[0..n-1]    string[0..n-1]      Zeichenkette
  2761. ptsin[0]         x
  2762. ptsin[1]         y
  2763.  
  2764. Ausgaben:
  2765.  
  2766. contrl[2]        0                   Einträge in ptsout
  2767. contrl[4]        0                   Einträge in intout
  2768.  
  2769.  
  2770. ∙ JUSTIFIED GRAPHICS TEXT (VDI 11, GDP 10)
  2771.  
  2772. "JUSTIFIED GRAPHICS TEXT" ermöglicht die  Ausgabe einer Zeichenkette mit
  2773. Attributen und Dehnung oder Stauchung auf die gewünschte Länge, wobei entweder
  2774. Wort- oder Zeichenzwischenräume gedehnt werden können. Bei Vektorfonts bezieht
  2775. sich die Längenangabe auf die Summation der Zeichenbreiten - Überhänge nach
  2776. links und rechts werden nicht berücksichtigt.
  2777.  
  2778. Dekl.:  void v_justified( WORD handle,int x, WORD y, BYTE *string, WORD length,
  2779.                           WORD word_space, WORD char_space );
  2780. Aufruf: v_justified( handle, x, y, string, length, word_space, char_space );
  2781.  
  2782. Variable         Belegung            Bedeutung
  2783. Eingaben:
  2784.  
  2785. contrl[0]        11                  GDP
  2786. contrl[1]        2                   Einträge in ptsin
  2787. contrl[3]        n+2                 Einträge in intin
  2788. contrl[5]        10                  v_justified
  2789. contrl[6]        handle
  2790. intin[0]         word_space          <> 0: Wortzwischenräume dehnen
  2791. intin[1]         char_space          <> 0: Zeichenzwischenräume dehnen
  2792. intin[2..n+1]    string[0..n-1]      Zeichenkette
  2793. ptsin[0]         x
  2794. ptsin[1]         y
  2795. ptsin[2]         length              horizontale Textlänge in Pixeln
  2796.  
  2797. Ausgaben:
  2798.  
  2799. contrl[2]        0                   Einträge in ptsout
  2800. contrl[4]        0                   Einträge in intout
  2801.  
  2802.  
  2803. ∙ SET CHARACTER HEIGHT, ABSOLUTE MODE (VDI 12)
  2804.  
  2805. Die Zeichenhöhe von der Basislinie bis zur Zeichenzellenobergrenze wird mit
  2806. dieser Funktion gesetzt. Bei Bitmapfonts wird, wenn die gewünschte Höhe nicht
  2807. als Bitmap vorliegt, vergrö₧ert oder verkleinert. Bei Vektorfonts stellen die
  2808. ausgegebenen Breiten char_width und cell_width gerundete Werte dar.
  2809.  
  2810. Dekl.:  void vst_height( WORD handle, WORD height, WORD *char_width,
  2811.                          WORD *char_height, WORD *cell_width, WORD *cell_height );
  2812. Aufruf: vst_height( handle, height, &char_width, &char_height, &cell_width,
  2813.                     &cell_height );
  2814.  
  2815. Variable         Belegung            Bedeutung
  2816. Eingaben:
  2817.  
  2818. contrl[0]        12                  vst_height
  2819. contrl[1]        1                   Einträge in ptsin
  2820. contrl[3]        0                   Einträge in intin
  2821. contrl[6]        handle
  2822. ptsin[1]         height              gewünschte Zeichenhöhe
  2823.  
  2824. Ausgaben:
  2825.  
  2826. contrl[2]        2                   Einträge in ptsout
  2827. contrl[4]        0                   Einträge in intout
  2828. ptsout[0]        char_width          ausgewählte Zeichenbreite
  2829. ptsout[1]        char_height         ausgewählte Zeichenhöhe
  2830. ptsout[2]        cell_width          ausgewählte Zeichenzellenbreite
  2831. ptsout[3]        cell_height         ausgewählte Zeichenzellenhöhe
  2832.  
  2833.  
  2834. ∙ SET CHARACTER BASELINE VECTOR (VDI 13)
  2835.  
  2836. Mit  dieser  Funktion kann man die Textdrehung in 1/10  Grad  einstellen.  Für
  2837. Bitmapfonts ist die Rotation nur in 90-Grad-Schritten möglich; bei Vektorfonts
  2838. stufenlos.
  2839.  
  2840. Dekl.:  WORD vst_rotation( WORD handle, WORD angle );
  2841. Aufruf: set_angle = vst_rotation( handle, angle );
  2842.  
  2843. Variable         Belegung            Bedeutung
  2844. Eingaben:
  2845.  
  2846. contrl[0]        13                  vst_rotation
  2847. contrl[1]        0                   Einträge in ptsin
  2848. contrl[3]        1                   Einträge in intin
  2849. contrl[6]        handle
  2850. intin[0]         angle               gewünschter Rotationswinkel
  2851.  
  2852. Ausgaben:
  2853.  
  2854. contrl[2]        0                   Einträge in ptsout
  2855. contrl[4]        1                   Einträge in intout
  2856. intout[0]        set_angle           ausgewählter Rotationswinkel
  2857.  
  2858.  
  2859. ∙ SET TEXT FACE (VDI 21)
  2860.  
  2861. Diese Funktion wählt den Zeichensatz <font> aus. Sollte kein Zeichensatz mit
  2862. dieser ID vorhanden sein, wird auf den Systemzeichensatz umgeschaltet.
  2863.  
  2864. Dekl.:  WORD vst_font( WORD handle, WORD font );
  2865. Aufruf: set_font = vst_font( handle, font);
  2866.  
  2867. Variable         Belegung            Bedeutung
  2868. Eingaben:
  2869.  
  2870. contrl[0]        21                  vst_font
  2871. contrl[1]        0                   Einträge in ptsin
  2872. contrl[3]        1                   Einträge in intin
  2873. contrl[6]        handle
  2874. intin[0]         font                gewünschter Zeichensatz
  2875.  
  2876. Ausgaben:
  2877.  
  2878. contrl[2]        0                   Einträge in ptsout
  2879. contrl[4]        1                   Einträge in intout
  2880. intout[0]        set_font            ausgewählter Zeichensatz
  2881.  
  2882.  
  2883. ∙ SET GRAPHIC TEXT COLOR INDEX (VDI 22)
  2884.  
  2885. Diese  Funktion  setzt die Farbe des Textes. Bei ungültigem Farbindex wird der
  2886. Farbindex 1 gesetzt.
  2887.  
  2888. Dekl.:  WORD vst_color( WORD handle, WORD color_index );
  2889. Aufruf: set_color = vst_color( handle, color_index );
  2890.  
  2891. Variable         Belegung            Bedeutung
  2892. Eingaben:
  2893.  
  2894. contrl[0]        22                  vst_color
  2895. contrl[1]        0                   Einträge in ptsin
  2896. contrl[3]        1                   Einträge in intin
  2897. contrl[6]        handle
  2898. intin[0]         color_index         gewünschte Textfarbe
  2899.  
  2900. Ausgaben:
  2901.  
  2902. contrl[2]        0                   Einträge in ptsout
  2903. contrl[4]        1                   Einträge in intout
  2904. intout[0]        set_color           ausgewählte Textfarbe
  2905.  
  2906.  
  2907. ∙ INQUIRE CURRENT GRAPHIC TEXT ATTRIBUTES (VDI 38)
  2908.  
  2909. Die gesetzten Textattribute werden von dieser Funktion geliefert.
  2910.  
  2911. Dekl.:  void vqt_attributes( WORD handle, WORD *attrib );
  2912. Aufruf: vqt_attributes( handle, attrib );
  2913.  
  2914. Variable         Belegung            Bedeutung
  2915. Eingaben:
  2916.  
  2917. contrl[0]        38                  vqt_attributes
  2918. contrl[1]        0                   Einträge in ptsin
  2919. contrl[3]        0                   Einträge in intin
  2920. contrl[6]        handle
  2921.  
  2922. Ausgaben:
  2923.  
  2924. contrl[2]        2                   Einträge in ptsout
  2925. contrl[4]        6                   Einträge in intout
  2926. intout[0]        attrib[0]           Zeichensatznummer
  2927. intout[1]        attrib[1]           Textfarbe
  2928. intout[2]        attrib[2]           Textrotation in 1/10 Grad
  2929. intout[3]        attrib[3]           horizontale Ausrichtung
  2930. intout[4]        attrib[4]           vertikale Ausrichtung
  2931. intout[5]        attrib[5]           Schreibmodus
  2932. ptsout[0]        attrib[6]           Zeichenbreite
  2933. ptsout[1]        attrib[7]           Zeichenhöhe
  2934. ptsout[2]        attrib[8]           Zeichenzellenbreite
  2935. ptsout[3]        attrib[9]           Zeichenzellenhöhe
  2936.  
  2937. Bemerkung:
  2938. Das ATARI-VDI gibt fehlerhafterweise in intout[5] den Schreibmodus-1 zurück. Mit
  2939. NVDI geschieht das nur bei eingeschalteter Fehlerkompatibilität.
  2940.  
  2941.  
  2942. ∙ SET GRAPHIC TEXT ALIGNMENT (VDI 39)
  2943.  
  2944. Die horizontale und vertikale Ausrichtung eines Textes kann mit dieser Funktion
  2945. beeinflu₧t werden. Bei falscher Eingabe für horizontale Ausrichtung wird der
  2946. Text linksjustiert. Die  fehlerhafte Angabe der vertikalen Ausrichtung bewirkt
  2947. Ausrichtung an der Basislinie.
  2948.  
  2949. Dekl.:  void vst_alignment( WORD handle, WORD hor_in, WORD vert_in,
  2950.                             WORD *hor_out, WORD *vert_out );
  2951. Aufruf: vst_alignment( handle, hor_in, vert_in, &hor_out, &vert_out );
  2952.  
  2953. Variable         Belegung            Bedeutung
  2954. Eingaben:
  2955.  
  2956. contrl[0]        39                  vst_alignment
  2957. contrl[1]        0                   Einträge in ptsin
  2958. contrl[3]        2                   Einträge in intin
  2959. contrl[6]        handle
  2960. intin[0]         hor_in              gewünschte horizontale Ausrichtung
  2961. intin[1]         vert_in             gewünschte vertikale Ausrichtung
  2962.  
  2963. Ausgaben:
  2964.  
  2965. contrl[2]        0                   Einträge in ptsout
  2966. contrl[4]        2                   Einträge in intout
  2967. intout[0]        hor_out             ausgewählte horizontale Ausrichtung
  2968. intout[1]        vert_out            ausgewählte vertikale Ausrichtung
  2969.  
  2970. Bedeutung von hor_in:
  2971. 0: linksjustiert
  2972. 1: zentriert
  2973. 2: rechtsjustiert
  2974.  
  2975. Bedeutung von vert_in:
  2976. 0: Basislinie
  2977. 1: Halblinie
  2978. 2: Zeichenoberkante
  2979. 3: Zeichenzellenunterkante
  2980. 4: Zeichenunterkante
  2981. 5: Zeichenzellenoberkante
  2982.  
  2983.  
  2984. ∙ SET GRAPHIC TEXT SPECIAL EFFECTS (VDI 106)
  2985.  
  2986. Mit  "SET  GRAPHIC  TEXT SPECIAL EFFECTS" kann man,  wie  es  der  Name  schon
  2987. andeutet, spezielle Texteffekte einstellen.
  2988.  
  2989. Dekl.:  WORD vst_effects( WORD handle, WORD effect );
  2990. Aufruf: set_effect = vst_effects( handle, effect );
  2991.  
  2992. Variable         Belegung            Bedeutung
  2993. Eingaben:
  2994.  
  2995. contrl[0]        106                 vst_effects
  2996. contrl[1]        0                   Einträge in ptsin
  2997. contrl[3]        1                   Einträge in intin
  2998. contrl[6]        handle
  2999. intin[0]         effect              gewünschter Texteffekt
  3000.  
  3001. Ausgaben:
  3002.  
  3003. contrl[2]        0                   Einträge in ptsout
  3004. contrl[4]        1                   Einträge in intout
  3005. intout[0]        set_effect          ausgewählter Texteffekt
  3006.  
  3007. Bedeutung von effect (Bitnummer):
  3008. 0: fett
  3009. 1: hell
  3010. 2: kursiv
  3011. 3: unterstrichen
  3012. 4: umrandet
  3013.  
  3014.  
  3015. ∙ SET CHARACTER HEIGHT, POINTS MODE (VDI 107)
  3016.  
  3017. Mit "SET CHARACTER HEIGHT, POINTS MODE" kann die Zeichenzellengrö₧e in Punkten
  3018. (1 pt  = 1/72") festgelegt werden.
  3019. Bei Bitmapfonts sucht diese Funktion den Font heraus, der in einfacher oder
  3020. doppelter Vergrö₧erung kleiner oder gleich der gewünschten Höhe ist. Bei
  3021. Vektorfonts kann man mit vst_point() nur die vordefinierten Höhen anwählen (in
  3022. der Regel sind das 8, 9, 10, 11, 12, 14, 18, 24, 36, und 48 pt).
  3023.  
  3024. Dekl.:  WORD vst_point( WORD handle, WORD point,
  3025.                         WORD *char_width, WORD *char_height,
  3026.                         WORD *cell_width, WORD *cell_height );
  3027. Aufruf: set_point = vst_point( handle, point, &char_width, &char_height,
  3028.                                &cell_width, &cell_height );
  3029.  
  3030. Variable         Belegung            Bedeutung
  3031. Eingaben:
  3032.  
  3033. contrl[0]        107                 vst_point
  3034. contrl[1]        0                   Einträge in ptsin
  3035. contrl[3]        1                   Einträge in intin
  3036. contrl[6]        handle
  3037. intin[0]         point               gewünschte Zeichenzellenhöhe (1/72")
  3038.  
  3039. Ausgaben:
  3040.  
  3041. contrl[2]        2                   Einträge in ptsout
  3042. contrl[4]        1                   Einträge in intout
  3043. intout[0]        set_point           ausgewählte Zeichenzellenhöhe (1/72")
  3044. ptsout[0]        char_width          ausgewählte Zeichenbreite
  3045. ptsout[1]        char_height         ausgewählte Zeichenhöhe
  3046. ptsout[2]        cell_width          ausgewählte Zeichenzellenbreite
  3047. ptsout[3]        cell_height         ausgewählte Zeichenzellenhöhe
  3048.  
  3049.  
  3050. ∙ INQUIRE TEXT EXTENT (VDI 116)
  3051.  
  3052. Bei Bitmapfonts ermittelt "INQUIRE  TEXT  EXTENT" die minimalen Ausma₧e eines
  3053. Rechtecks, das die übergebene Zeichenkette umrahmt. Bei Vektorfonts addiert
  3054. diese Funktion nur die Schrittweiten ohne Pair- oder Track-Kerning und
  3055. Zeichenüberhänge zu beachten.
  3056. Die Koordinaten der vier Eckpunkte werden relativ zu einem Koordinatensystem
  3057. ausgegeben, wobei die Punkte gegen den Uhrzeigersinn durchnummeriert sind. Der
  3058. erste Punkt liegt ohne Textdrehung in der linken unteren Ecke des Textrechtecks.
  3059.  
  3060. Dekl.:  void vqt_extent( WORD handle, BYTE *string, WORD *extent );
  3061. Aufruf: vqt_extent( handle, string, extent );
  3062.  
  3063. Variable         Belegung            Bedeutung
  3064. Eingaben:
  3065.  
  3066. contrl[0]        116                 vqt_extent
  3067. contrl[1]        0                   Einträge in ptsin
  3068. contrl[3]        n                   Einträge in intin
  3069. contrl[6]        handle
  3070. intin[0..n-1]    string[0..n-1]      Zeichenkette
  3071.  
  3072. Ausgaben:
  3073.  
  3074. contrl[2]        4                   Einträge in ptsout
  3075. contrl[4]        0                   Einträge in intout
  3076. ptsout[0..7]     extent[0..7]        Koordinaten des Textrechtecks
  3077.  
  3078.  
  3079. ∙ INQUIRE CHARACTER CELL WIDTH (VDI 117)
  3080.  
  3081. Bei Bitmapfonts lieferte diese Funktion die horizontalen Textausma₧e zurück.
  3082. Wendet man sie auf einen Vektorfont an, wird für das Zeichen <index> die
  3083. gerundete Schrittweite zurückgegeben. Diese Schrittweite kann nur im
  3084. Zusammenhang mit v_gtext() benutzt werden. Versucht man die Schrittweiten auf
  3085. v_ftext() anzuwenden wird man falsche Zeichenpositionen berechnen.
  3086.  
  3087. Dekl.:  WORD vqt_width( WORD handle, WORD index,
  3088.                         WORD *cell_width, WORD *left_delta, WORD *right_delta );
  3089. Aufruf: status = vqt_width( handle, index,
  3090.                             &cell_width, &left_delta, &right_delta );
  3091.  
  3092. Variable         Belegung            Bedeutung
  3093. Eingaben:
  3094.  
  3095. contrl[0]        117                 vqt_width
  3096. contrl[1]        0                   Einträge in ptsin
  3097. contrl[3]        1                   Einträge in intin
  3098. contrl[6]        handle
  3099. intin[0]         character           Zeichennummer
  3100.  
  3101. Ausgaben:
  3102.  
  3103. contrl[2]        3                   Einträge in ptsout
  3104. contrl[4]        1                   Einträge in intout
  3105. intout[0]        status              Zeichennummer oder -1 (Fehler)
  3106. ptsout[0]        cell_width          Zeichenzellenbreite
  3107. ptsout[2]        left_delta          linker Abstand zur Zeichenzelle
  3108. ptsout[4]        right_delta         rechter Abstand zur Zeichenzelle
  3109.  
  3110. Bemerkung:
  3111. Um die Breite einer Zeichenkette zu ermitteln, ist der Aufruf von vqt_extent(),
  3112. vqt_f_extent() oder vqt_real_extent() zu  empfehlen.
  3113. Wer feststellen möchte, ob ein Font äquidistant (monospaced) oder proportional
  3114. ist, sollte nicht alle Zeichenpaare über vqt_width() vergleichen, sondern zuerst
  3115. prüfen ob, vqt_name() hierüber Informationen zurückgibt.
  3116.  
  3117.  
  3118. ∙ LOAD FONTS (VDI 119)
  3119.  
  3120. Diese Funktion lädt die in ASSIGN.SYS für das mit <handle> bezeichnete Gerät
  3121. eingetragenen Bitmapfonts und sorgt dafür, da₧ auch auf die Vektorfonts
  3122. zugegriffen werden kann. Zurückgegeben wird die Anzahl der zusätzlich
  3123. verfügbaren Zeichensätze.
  3124.  
  3125. Bevor man vst_load_fonts() aufruft, sollte man mit vq_gdos() überprüfen, ob das
  3126. VDI Zeichensätze nachladen kann.
  3127.  
  3128. Dekl.:  WORD vst_load_fonts( WORD handle, WORD select );
  3129. Aufruf: additional = vst_load_fonts( handle, 0 );
  3130.  
  3131. Variable         Belegung            Bedeutung
  3132. Eingaben:
  3133.  
  3134. contrl[0]        119                 vst_load_fonts
  3135. contrl[1]        0                   Einträge in ptsin
  3136. contrl[3]        1                   Einträge in intin
  3137. contrl[6]        handle
  3138. intin[0]         select              0 (reserviert)
  3139.  
  3140. Ausgaben:
  3141.  
  3142. contrl[2]        0                   Einträge in ptsout
  3143. contrl[4]        1                   Einträge in intout
  3144. intout[0]        additional          Anzahl der geladenen Zeichensätze
  3145.  
  3146.  
  3147. ∙ UNLOAD FONTS (VDI 120)
  3148.  
  3149. Der durch die Bitmapfonts belegte Speicher wird von "UNLOAD FONTS" freigegeben.
  3150.  
  3151. Dekl.:  void vst_unload_fonts( WORD handle, WORD select );
  3152. Aufruf: vst_unload_fonts( handle, 0);
  3153.  
  3154. Variable         Belegung            Bedeutung
  3155. Eingaben:
  3156.  
  3157. contrl[0]        120                 vst_unload_fonts
  3158. contrl[1]        0                   Einträge in ptsin
  3159. contrl[3]        0                   Einträge in intin
  3160. contrl[6]        handle
  3161. intin[0]         select              0 (reserviert)
  3162.  
  3163. Ausgaben:
  3164.  
  3165. contrl[2]        0                   Einträge in ptsout
  3166. contrl[4]        0                   Einträge in intout
  3167.  
  3168.  
  3169. ∙ INQUIRE FACE NAME AND INDEX (VDI 130)
  3170.  
  3171. In NVDI 3 gibt es eine erweiterte Form von vqt_name():
  3172.  
  3173. Dekl.:  WORD vqt_name( WORD handle, WORD index, BYTE *name, UWORD *font_format,
  3174.                        UWORD *flags );
  3175. Aufruf: id = vqt_name( handle, index, name, &font_format, &flags );
  3176.  
  3177. Variable         Belegung            Bedeutung
  3178. Eingaben:
  3179.  
  3180. contrl[0]        130                 vqt_name
  3181. contrl[1]        0                   Einträge in ptsin
  3182. contrl[3]        2                   Einträge in intin, kein Tippfehler!
  3183. contrl[5]        1                   mehr Informationen liefern!
  3184. contrl[6]        handle
  3185. intin[0]         index               Nummer (1 bis Maximalanzahl)
  3186.  
  3187. Ausgaben:
  3188.  
  3189. contrl[2]        0                   Einträge in ptsout
  3190. contrl[4]        35                  Einträge in intout
  3191. intout[0]        id                  Zeichensatznummer
  3192. intout[1..16]    name[0..15]         Zeichensatzname
  3193. intout[17..32]   name[16..31]        Zeichensatz-Attribute
  3194. intout[33]       name[32]            0: Bitmapfont, 1: Vektorfont
  3195. intout[34]       flags/font_format
  3196.  
  3197. Im High-Byte von intout[34] wird <flags> zurückgeliefert:
  3198. 0: Proportionalfont
  3199. 1: äquidistanter Font
  3200.  
  3201. Im Low-Byte von intout[34] wird <font_format> zurückgeliefert:
  3202. 1: Bitmap-Font
  3203. 2: Speedo-Font
  3204. 4: TrueType-Font
  3205. 8: Type 1-Font
  3206.  
  3207. Bemerkungen:
  3208. Um festzustellen, was für einen Font man vor sich hat, mu₧ man die Anzahl der
  3209. Einträge in intout (contrl[4]) beachten. Ist contrl[4] 33, so sind keine
  3210. zusätzlichen Informationen vorhanden und demzufolge mu₧ es sich um einen
  3211. Bitmapfont handeln. Ist contrl[4] == 34, wird nur zusätzlich in intout[33]
  3212. (name[32]) mitgeteilt, ob es sich um einen Vektorfont handelt. Nur wenn
  3213. contrl[4] == 35 ist, kann man mit intout[34] (flags) den Fonttyp genauer
  3214. feststellen und sofort erkennen, ob der Font äquidistant (monospaced) ist.
  3215.  
  3216. intout[34] wird nur zurückgeliefert, wenn contrl[3] > 1 und contrl[5] = 1!
  3217.  
  3218.  
  3219. ∙ INQUIRE CURRENT FACE INFORMATION (VDI 131)
  3220.  
  3221. Es wird Auskunft über den aktuellen Zeichensatz gegeben, wobei die Attribute und
  3222. Vergrö₧erung/Verkleinerung berücksichtigt werden.
  3223.  
  3224. Dekl.:  void vqt_fontinfo( WORD handle, WORD *minADE, WORD *maxADE,
  3225.                            WORD *distances, WORD *maxwidth, WORD *effects );
  3226. Aufruf: vqt_fontinfo( handle, &minADE, &maxADE, distances, &max_width, effects );
  3227.  
  3228. Variable         Belegung            Bedeutung
  3229. Eingaben:
  3230.  
  3231. contrl[0]        131                 vqt_fontinfo
  3232. contrl[1]        0                   Einträge in ptsin
  3233. contrl[3]        0                   Einträge in intin
  3234. contrl[6]        handle
  3235.  
  3236. Ausgaben:
  3237.  
  3238. contrl[2]        5                   Einträge in ptsout
  3239. contrl[4]        2                   Einträge in intout
  3240. intout[0]        minADE              niedrigste Zeichennummer
  3241. intout[1]        maxADE              höchste Zeichennummer
  3242. ptsout[0]        maxwidth            Maximale Zeichenzellenbreite
  3243. ptsout[1]        distances[0]
  3244. ptsout[2]        effects[0]
  3245. ptsout[3]        distances[1]
  3246. ptsout[4]        effects[1]
  3247. ptsout[5]        distances[2]
  3248. ptsout[6]        effects[2]
  3249. ptsout[7]        distances[3]
  3250. ptsout[9]        distances[4]
  3251.  
  3252. Bedeutung von distances:
  3253. distances[0]: Abstand von der Untergrenze der Zeichenzelle zur Basislinie
  3254. distances[1]: Abstand der Unterlänge zur Basislinie
  3255. distances[2]: Abstand der Halblinie zur Basislinie
  3256. distances[3]: Abstand der Zeichenobergrenzze zur Basislinie
  3257. distances[4]: Abstand der Zeichenzellenobergrenze zur Basislinei
  3258.  
  3259. Bedeutung von effects:
  3260. effects[0]: Verbreiterung bei Texteffekten
  3261. effects[1]: linker Abstand bei Kursivschrift
  3262. effects[2]: rechter Abstand bei Kursivschrift
  3263.  
  3264.  
  3265. ∙ INQUIRE EXTENDED FONT INFORMATION (VDI 229)
  3266.  
  3267. Die Funktion vqt_xfntinfo() liefert in einer XFNT_INFO-Struktur die mit <flags>
  3268. angeforderten Informationen über einen Font. Wenn ein von 0 verschiedener Index
  3269. übergeben wird, sucht vqt_xfntinfo() den entsprechenden Font und liefert die durch
  3270. <flags> bezeichneten Einträge. Wenn <index> 0 ist, wird der Font mit der ID <id>
  3271. gesucht. Sollte <id> ebenfalls 0 sein, werden Informationen über den bereits
  3272. eingestellten Font zurückgegeben.
  3273.  
  3274. Damit die Informationen in die XFNT_INFO-Struktur eingetragen werden, mu₧ die
  3275. Grö₧e der Struktur mu₧ in das Strukturelement <size> eingetragen werden.
  3276.  
  3277. Dekl.:  WORD vqt_xfntinfo( WORD handle, WORD flags, WORD id, WORD index,
  3278.                            XFNT_INFO *info );
  3279. Aufruf: id = vqt_xfntinfo( handle, flags, id, index, &info );
  3280.  
  3281. Variable         Belegung            Bedeutung
  3282. Eingaben:
  3283.  
  3284. contrl[0]        229                 vqt_xfntinfo
  3285. contrl[1]        0                   Einträge in ptsin
  3286. contrl[3]        5                   Einträge in intin
  3287. contrl[5]        0
  3288. contrl[6]        handle
  3289. intin[0]         flag                Bitvektor für auszugebende Informationen
  3290. intin[1]         id                  ID des Fonts oder 0 für eingestellten Font
  3291. intin[2]         index               Index des Fonts oder 0, wenn die ID benutzt
  3292.                                      werden soll
  3293. intin[3..4]      info                Zeiger auf die XFNT_INFO-Struktur
  3294.  
  3295. Ausgaben:
  3296.  
  3297. contrl[2]        0                   Einträge in ptsout
  3298. contrl[4]        3                   Einträge in intout
  3299. intout[0]        font_format         Fontformat
  3300. intout[1]        font_id             ID des eingestellten Fonts
  3301. intout[2]        index               Index des eingestellten Fonts
  3302.  
  3303. Bedeutung von flags (Bitnummer):
  3304. 0:    vollständigen Fontnamen zurückgeben (font_name)
  3305. 1:    Name der Fontfamilie zurückgeben (family_name)
  3306. 2:    Stil des Fonts zurückgeben (style_name)
  3307. 3:    Dateinamen des Fonts zurückgeben (file_name1)
  3308. 4:    2. optionalen Dateinamen zurückgeben (file_name2)
  3309. 5:    3. optionalen Dateinamen zurückgeben (file_name3)
  3310. 8:    Höhen in pt ohne Vergrö₧erung zurückliefern (pt_cnt, pt_sizes)
  3311. 9:    Höhen in pt für doppelte Vergrö₧erung zurückliefern (pt_cnt, pt_sizes)
  3312.  
  3313. Bedeutung von font_format:
  3314. 1: Bitmap-Font
  3315. 2: Speedo-Font
  3316. 4: TrueType-Font
  3317. 8: Type 1-Font
  3318.  
  3319. Bit 8 und 9 von flags unterscheiden sich in der Funktion nur bei Bitmap-Fonts.
  3320. Ist Bit 8 gesetzt, werden die Höhen geliefert, die ohne Vergrö₧erung vorhanden
  3321. sind. Wenn Bit 9 gesetzt ist, werden die Höhen geliefert, bei denen vergrö₧ert
  3322. wird.
  3323.  
  3324. Beschreibung der XFNT_INFO-Struktur:
  3325.  
  3326. typedef struct
  3327. {
  3328.    LONG  size;             /* Länge der Struktur, mu₧ vor vqt_xfntinfo() gesetzt werden */
  3329.    WORD  format;           /* Fontformat, z.B. 4 für TrueType */
  3330.    WORD  id;               /* Font-ID, z.B. 6059 */
  3331.    WORD  index;            /* Index */
  3332.    BYTE  font_name[50];    /* vollständiger Fontname, z.B. "Century 725 Italic BT" */
  3333.    BYTE  family_name[50];  /* Name der Fontfamilie, z.B. "Century725 BT" */
  3334.    BYTE  style_name[50];   /* Name des Fontstils, z.B. "Italic" */
  3335.    BYTE  file_name1[200];  /* Name der 1. Fontdatei, z.B. "C:\FONTS\TT1059M_.TTF" */
  3336.    BYTE  file_name2[200];  /* Name der optionalen 2. Fontdatei */
  3337.    BYTE  file_name3[200];  /* Name der optionalen 3. Fontdatei */
  3338.    WORD  pt_cnt;           /* Anzahl der Punkthöhen für vst_point(), z.B. 10 */
  3339.    WORD  pt_sizes[64];     /* verfügbare Punkthöhen,
  3340.                               z.B. { 8, 9, 10, 11, 12, 14, 18, 24, 36, 48 } */
  3341. } XFNT_INFO;
  3342.  
  3343. Bei allen Zeichenketten in der XFNT_INFO-Struktur handelt es sich um C-Strings,
  3344. die mit einem 0-Byte abgeschlossen sind. Strukturelemente, die nicht mit <flags>
  3345. angefordert wurden, haben keinen definierten Inhalt.
  3346.  
  3347.  
  3348. ∙ SET TEXT FACE BY NAME (VDI 230, 0)
  3349.  
  3350. Diese Funktion sucht einen Font mit Namen <font_name> in einem der durch den
  3351. Bitvektor <font_format> angegebenen Fontformate und stellt ihn ein. Fehlende
  3352. oder überschüssige Leerzeichen werden bei der Suche ignoriert. Wenn in den
  3353. angegebenen Fontformaten kein Font des gesuchten Namens vorhanden ist, wird der
  3354. Systemfont gesetzt.
  3355.  
  3356. Dekl.:  WORD vst_name( WORD handle, WORD font_format,
  3357.                        BYTE *font_name, BYTE *ret_name );
  3358. Aufruf: id = vst_name( handle, font_format, font_name, ret_name );
  3359.  
  3360. Variable         Belegung            Bedeutung
  3361. Eingaben:
  3362.  
  3363. contrl[0]        230                 vst_name
  3364. contrl[1]        0                   Einträge in ptsin
  3365. contrl[3]        n                   Einträge in intin
  3366. contrl[5]        0                   Unterfunktionsnummer: Font einstellen
  3367. contrl[6]        handle
  3368. intin[0]         font_format         zu berücksichtigende Fontformate
  3369. intin[1..n]      font_name[0..n-1]   einzustellender Fontname
  3370.  
  3371. Ausgaben:
  3372.  
  3373. contrl[2]        0                   Einträge in ptsout
  3374. contrl[4]        m                   Einträge in intout
  3375. intout[0]        id                  ID des eingestellten Fonts
  3376. intout[1..m]     ret_name[0..m-1]    Name des eingestellten Fonts
  3377.  
  3378. Bedeutung von font_format:
  3379. 1: Bitmap-Font
  3380. 2: Speedo-Font
  3381. 4: TrueType-Font
  3382. 8: Type 1-Font
  3383.  
  3384.  
  3385. ∙ INQUIRE FACE NAME AND ID BY NAME (VDI 230, 100)
  3386.  
  3387. Diese Funktion sucht einen Font mit Namen <font_name> in einem der durch den
  3388. Bitvektor <font_format> angegebenen Fontformate, wobei fehlende oder
  3389. überschüssige Leerzeichen ignoriert werden. Wenn der Font gefunden wird, werden
  3390. Font-ID und Name in intout zurückgeliefert.
  3391. Falls kein Font auffindbar ist, wird eine 0 in intout[0] zurückgeliefert, um
  3392. einen Fehler zu signalisieren.
  3393.  
  3394. Dekl.:  WORD vqt_name_and_id( WORD handle, WORD font_format,
  3395.                               BYTE *font_name, BYTE *ret_name );
  3396. Aufruf: id = vqt_name_and_id( handle, font_format, font_name, ret_name );
  3397.  
  3398. Variable         Belegung            Bedeutung
  3399. Eingaben:
  3400.  
  3401. contrl[0]        230                 vst_name
  3402. contrl[1]        0                   Einträge in ptsin
  3403. contrl[3]        n                   Einträge in intin
  3404. contrl[5]        100                 Unterfunktionsnummer: Font suchen
  3405. contrl[6]        handle
  3406. intin[0]         font_format         zu berücksichtigende Fontformate
  3407. intin[1..n]      font_name[0..n-1]   einzustellender Fontname
  3408.  
  3409. Ausgaben:
  3410.  
  3411. contrl[2]        0                   Einträge in ptsout
  3412. contrl[4]        m                   Einträge in intout
  3413. intout[0]        id                  ID des gefundenen Fonts oder 0
  3414. intout[1..m]     ret_name[0..m-1]    Name des gefundenen Fonts
  3415.  
  3416. Bedeutung von font_format:
  3417. 1: Bitmap-Font
  3418. 2: Speedo-Font
  3419. 4: TrueType-Font
  3420. 8: Type 1-Font
  3421.  
  3422.  
  3423. ∙ SET CHARACTER WIDTH, ABSOLUTE MODE (VDI 231)
  3424.  
  3425. Mit dieser Funktion kann man die Zeichenbreite in Pixeln setzen. Sobald der der
  3426. nächste Aufruf von vst_height(), vst_point() oder vst_arbpt() erfolgt, wird die
  3427. Breite wieder zurückgesetzt.
  3428.  
  3429. Dekl.:  void vst_width( WORD handle, WORD width, WORD *char_width,
  3430.                         WORD *char_height, WORD *cell_width, WORD *cell_height );
  3431. Aufruf: vst_width( handle, width, &char_width, &char_height,
  3432.                    &cell_width, &cell_height );
  3433.  
  3434. Variable         Belegung            Bedeutung
  3435. Eingaben:
  3436.  
  3437. contrl[0]        231                 vst_width
  3438. contrl[1]        1                   Einträge in ptsin
  3439. contrl[3]        0                   Einträge in intin
  3440. contrl[6]        handle
  3441. ptsin[0]         width               gewünschte Zeichenbreite
  3442.  
  3443. Ausgaben:
  3444.  
  3445. contrl[2]        2                   Einträge in ptsout
  3446. contrl[4]        0                   Einträge in intout
  3447. ptsout[0]        char_width          ausgewählte Zeichenbreite
  3448. ptsout[1]        char_height         ausgewählte Zeichenhöhe
  3449. ptsout[2]        cell_width          ausgewählte Zeichenzellenbreite
  3450. ptsout[3]        cell_height         ausgewählte Zeichenzellenhöhe
  3451.  
  3452. Bemerkungen:
  3453. Zum Einstellen des Breiten-Höhen-Verhältnisses ist es sinnvoller, vst_setsize()
  3454. aufzurufen, da diese Funktion feinere Einstellungen erlaubt.
  3455.  
  3456.  
  3457. ∙ INQUIRE SPEEDO HEADER INFORMATION (VDI 232)
  3458.  
  3459. Die Funktion vqt_fontheader() kopiert den Header des eingestellten Speedo-Fonts
  3460. in einen Buffer und liefert, wenn vorhanden, einen Zeiger auf die dazugehörige
  3461. TDF-Datei. Der übergebene Buffer sollte sicherheitshalber 1 Kb gro₧ sein, da die
  3462. Länge des Speedo-Fontheader vom jeweiligen Font und möglichen
  3463. Formaterweiterungen abhängt.
  3464. Für andere Fontformate (TrueType, ...) wird versucht, den Header nachzubilden.
  3465.  
  3466. Man sollte daran denken, da₧ für jeden Aufruf von vqt_fontheader() eventuell
  3467. mehrfach auf die Festplatte zugegriffen werden mu₧ - bei 300 oder mehr Fonts
  3468. kann das immerhin einige wenige Sekündchen dauern. Man sollte daher den häufigen
  3469. Aufruf dieser Funktion vermeiden oder wichtige Angaben selbst speichern und beim
  3470. Programmstart laden.
  3471.  
  3472.  
  3473. Dekl.:  void vqt_fontheader( WORD handle, void *buffer, BYTE *tdf_name );
  3474. Aufruf: vqt_fontheader( handle, buffer, tdf_name );
  3475.  
  3476. Variable         Belegung            Bedeutung
  3477. Eingaben:
  3478.  
  3479. contrl[0]        232                 vqt_fontheader
  3480. contrl[1]        0                   Einträge in ptsin
  3481. contrl[3]        2                   Einträge in intin
  3482. contrl[6]        handle
  3483. intin[0..1]      buffer              Buffer für den Fontheader
  3484.  
  3485. Ausgaben:
  3486. contrl[2]        0                   Einträge in ptsout
  3487. contrl[4]        n                   Länge des TDF-Pfads
  3488. intout[0..n-1]   tdf_name[0..n-1]    absoluter Pfad und Name des TDFs
  3489.  
  3490. Bemerkung:
  3491.  
  3492. Für Programmierer dürften die folgenden Einträge des Fontheaders am
  3493. interessantesten sein:
  3494.  
  3495. Name      Offset  Länge   Beschreibung
  3496. FH_FNTNM    24     70     Name des Fonts (siehe auch vqt_name()),
  3497.                           z.B. "Century 725 Italic BT"
  3498. FH_NKTKS   258      2     Anzahl der Track-Kerning-Informationen
  3499. FH_NKPRS   260      2     Anzahl der Kerning-Paare, (siehe auch vst_kern())
  3500. FH_CLFGS   263      1     Klassifizierung, u.a. Italic und Monospace
  3501. FH_SFNTN   266     32     Name des korrespondierenden Postscript-Fonts,
  3502.                           z.B. "Century725BT-Italic"
  3503. FH_SFACN   298     16     Kurzname der Fontfamilie, z.B. "Century725 BT"
  3504. FH_FNTFM   314     14     Stil/Form, z.B. "Italic"
  3505. FH_ITANG   328      2     Schrägstellung in 1/256-Grad (bei italic-Schnitten),
  3506.                           z.B 4480 (17,5 Grad)
  3507.  
  3508.  
  3509. ∙ INQUIRE TRACK KERNING INFORMATION (VDI 234)
  3510.  
  3511. Diese Funktion liefert getrennt in x- und y- Richtung die pro Zeichen durch
  3512. Track-Kerning entstehende Verschiebung zurück.
  3513.  
  3514. Dekl.:  void vqt_trackkern( WORD handle, fix31 *x_offset, fix31 *y_offset );
  3515. Aufruf: vqt_trackkern( handle, &x_offset, &y_offset );
  3516.  
  3517. Variable         Belegung            Bedeutung
  3518. Eingaben:
  3519.  
  3520. contrl[0]        234                 vqt_trackkern
  3521. contrl[1]        0                   Einträge in ptsin
  3522. contrl[3]        0                   Einträge in intin
  3523. contrl[6]        handle
  3524.  
  3525. Ausgaben:
  3526. contrl[2]        0                   Einträge in ptsout
  3527. contrl[4]        4                   Einträge in intout
  3528. intout[0..1]     x_offset            x-Verschiebung in 1/65536 Pixeln
  3529. intout[2..3]     y_offset            y-Verschiebung in 1/65536 Pixeln
  3530.  
  3531.  
  3532. ∙ INQUIRE PAIR KERNING INFORMATION (VDI 235)
  3533.  
  3534. Die Funktion vqt_pairkern() liefert die zwischen zwei Zeichen durch Pair-Kerning
  3535. entstehende Verschiebung zurück.
  3536.  
  3537. Dekl.:  void vqt_pairkern( WORD handle, WORD index1, WORD index2,
  3538.                            fix31 *x_offset, fix31 *y_offset );
  3539. Aufruf: vqt_pairkern( handle, index1, index2, &x_offset, &y_offset );
  3540.  
  3541. Variable         Belegung            Bedeutung
  3542. Eingaben:
  3543.  
  3544. contrl[0]        235                 vqt_pairkern
  3545. contrl[1]        0                   Einträge in ptsin
  3546. contrl[3]        2                   Einträge in intin
  3547. contrl[6]        handle
  3548. intin[0]         index1              erstes Zeichen
  3549. intin[1]         index2              darauf folgendes Zeichen
  3550.  
  3551. Ausgaben:
  3552. contrl[2]        0                   Einträge in ptsout
  3553. contrl[4]        4                   Einträge in intout
  3554. intout[0..1]     x_offset            x-Verschiebung in 1/65536 Pixeln
  3555. intout[2..3]     y_offset            y-Verschiebung in 1/65536 Pixeln
  3556.  
  3557.  
  3558. ∙ SET CHARACTER MAPPING MODE (VDI 236)
  3559.  
  3560. Mit dieser Funktion kann man vom ASCII-Mapping auf direktes Mapping umschalten,
  3561. d.h. man erhält z.B. für eine 65 nicht mehr das Zeichen A, sondern je nach
  3562. verwendetem Font das Zeichen, das sich unter diesem Index verbirgt. Wenn man auf
  3563. direktes Mapping umschaltet, ändert sich au₧erdem die Anzahl der vorhandenen
  3564. Zeichen pro Font (minADE und maxADE bei vqt_fontinfo) von 256 auf die Zahl der
  3565. tatsächlich vorhandenen Zeichen.
  3566.  
  3567. Dekl.:  void vst_charmap( WORD handle, WORD mode );
  3568. Aufruf: void vst_charmap( handle, mode );
  3569.  
  3570. Variable         Belegung            Bedeutung
  3571. Eingaben:
  3572.  
  3573. contrl[0]        236                 vst_charmap
  3574. contrl[1]        0                   Einträge in ptsin
  3575. contrl[3]        1                   Einträge in intin
  3576. contrl[6]        handle
  3577. intin[0]         mode                Zeichen-Mapping
  3578.  
  3579. Ausgaben:
  3580.  
  3581. contrl[2]        0                   Einträge in ptsout
  3582. contrl[4]        0                   Einträge in intout
  3583.  
  3584. Bedeutung von mode:
  3585. 0: direktes Mapping, keine Umsetzung des Zeichen-Index
  3586. 1: Zeichen-Index wird als ASCII-Wert interpretiert
  3587.  
  3588. Bemerkungen:
  3589. Man sollte, wenn man ASCII-Mapping einschalten will, nicht irgendeinen von 0
  3590. verschiedenen Wert, sondern 1 übergeben, da es durchaus denkbar ist, da₧
  3591. demnächst noch weitere Mappings (z.B. Unicode) vorhanden sind.
  3592.  
  3593.  
  3594. ∙ SET KERNING MODE (VDI 237)
  3595.  
  3596. Mit dieser Funktion kann man das gewünschte Track-Kerning und Pair-Kerning ein-
  3597. oder ausschalten. Informationen für Track-Kerning sind in den meisten
  3598. Speedo-Fonts enhalten. Normale TrueType-Fonts bieten kein Track-Kerning. Die
  3599. neuen TrueType-GX-Fonts enthalten dagegen oftmals Daten für Track-Kerning.
  3600.  
  3601. Dekl.:  void vst_kern( WORD handle, WORD track_mode, WORD pair_mode,
  3602.                        WORD *tracks, WORD *pairs );
  3603. Aufruf: vst_kern( handle, track_mode, pair_mode, &track, &pairs );
  3604.  
  3605. Variable         Belegung            Bedeutung
  3606. Eingaben:
  3607.  
  3608. contrl[0]        237                 vst_kern
  3609. contrl[1]        0                   Einträge in ptsin
  3610. contrl[3]        2                   Einträge in intin
  3611. contrl[6]        handle
  3612. intin[0]         track_mode          Track-Kerning-Modus
  3613. intin[1]         pair_mode           Pair-Kerning aus oder ein
  3614.  
  3615. Ausgaben:
  3616.  
  3617. contrl[2]        0                   Einträge in ptsout
  3618. contrl[4]        2                   Einträge in intout
  3619. intout[0]        track               das gesetzte Track-Kerning
  3620. intout[1]        pairs               Anzahl der Kerning-Paare
  3621.  
  3622. Bedeutung von track_mode:
  3623. 0: kein Track-Kerning
  3624. 1: normal
  3625. 2: tight
  3626. 3: very tight
  3627.  
  3628. Bedeutung von pair_mode:
  3629. 0: kein Pair-Kerning
  3630. 1: Pair-Kerning benutzen
  3631.  
  3632. Bemerkungen:
  3633. Mit NVDI kann man ein selbstdefiniertes Track-Kerning einstellen. Der
  3634. Track-Modus (track_mode) wird dafür auf 255 gesetzt, der gewünschte zusätzliche
  3635. Abstand in 1/65536 Pixeln wird in intin[2..3] eingetragen und contrl[3] mu₧ eine
  3636. 4 enthalten.
  3637.  
  3638. Dekl.:  void vst_track_offset( WORD handle, fix31 offset, WORD pair_mode,
  3639.                                WORD *tracks, WORD *pairs );
  3640. Aufruf: vst_track_offset( handle, offset, pair_mode, &tracks, &pairs );
  3641.  
  3642. Variable         Belegung            Bedeutung
  3643. Eingaben:
  3644.  
  3645. contrl[0]        237                 vst_kern
  3646. contrl[1]        0                   Einträge in ptsin
  3647. contrl[3]        4                   Einträge in intin
  3648. contrl[6]        handle
  3649. intin[0]         255                 benutzerdefiniert
  3650. intin[1]         pair_mode           Pair-Kerning aus oder ein
  3651. intin[2..3]      offset              Abstand
  3652.  
  3653. Ausgaben:
  3654.  
  3655. contrl[2]        0                   Einträge in ptsout
  3656. contrl[4]        2                   Einträge in intout
  3657. intout[0]        track               das gesetzte Track-Kerning
  3658. intout[1]        pairs               Anzahl der Kerning-Paare
  3659.  
  3660.  
  3661. ∙ GET CHARACTER BITMAP INFORMATION (VDI 239)
  3662.  
  3663. Diese Funktion liefert den Zeiger auf die zu einem Zeichen gehörende Bitmap und
  3664. deren Ma₧e zurück. Die zurückgelieferten Offsets sind auch im Zusammenhang mit
  3665. v_getoutline() gültig.
  3666.  
  3667. Dekl.:  void v_getbitmap_info( WORD handle, WORD index,
  3668.                                fix31 *x_advance, fix31 *y_advance,
  3669.                                fix31 *x_offset, fix31 *y_offset,
  3670.                                WORD *width, WORD *height,  WORD *bitmap );
  3671. Aufruf: v_getbitmap_info( handle, index, &x_advance, &y_advance,
  3672.                           &x_offset, &y_offset, &width, &height, bitmap );
  3673.  
  3674. Variable         Belegung            Bedeutung
  3675. Eingaben:
  3676.  
  3677. contrl[0]        239                 v_getbitmap_info
  3678. contrl[1]        0                   Einträge in ptsin
  3679. contrl[3]        1                   Einträge in intin
  3680. contrl[6]        handle
  3681. intin[0]         index               Zeichen-Index
  3682.  
  3683. Ausgaben:
  3684.  
  3685. contrl[2]        0                   Einträge in ptsout
  3686. contrl[4]        12                  Einträge in intout
  3687. intout[0]        width               Breite der Bitmap
  3688. intout[1]        height              Höhe der Bitmap
  3689. intout[2..3]     x_advance           x-Abstand in 1/65536 Pixeln
  3690. intout[4..5]     y_advance           y-Abstand in 1/65536 Pixeln
  3691. intout[6..7]     x_offset            x-Verschiebung in 1/65536 Pixeln
  3692. intout[8..9]     y_offset            y-Verschiebung in 1/65536 Pixeln
  3693. intout[10..11]   bitmap              Zeiger auf die Bitmap
  3694.  
  3695. Bedeutung von x_advance, y_advance:
  3696. Dieser Advance-Vektor gibt den Abstand des nächsten Zeichens in 1/65536 Pixeln an.
  3697.  
  3698. Bedeutung von x_offset, y_offset:
  3699. x_offset und y_offset geben den Abstand der Bitmap zur Position der Zeichenzelle
  3700. an. Das ist nötig, da die Bitmap meistens kleiner als die Zeichenzelle ist (z.B.
  3701. bei Zeichen ohne Unterlängen).
  3702.  
  3703. Bemerkungen:
  3704. Um auch ohne NVDI 3 nachvollziehbare Ausgaben zu bekommen, sollten die
  3705. Texteffekte (vst_effects()) ausgeschaltet sein (einige Versionen eines
  3706. Zusatzprogrammes für Vektorfonts zeigen sonst sehr unterschiedlich Ergebnisse).
  3707. Da der Zeiger auf die Bitmap in der Regel in den Zeichen-Cache verweist, sollte
  3708. man sich die Bitmap direkt nach dem Aufruf kopieren (AES-Kontextswitch durch
  3709. wind_update() verhindern!!) - andernfalls könnte der Zeiger schon wieder
  3710. ungültig sein.
  3711. Au₧erdem sollte man v_getbitmap_info() nicht für enorm gro₧e Zeichen (z.B. 300
  3712. pt und mehr) aufrufen, da diese je nach Cache-Grö₧e evtl. nicht mehr komplett
  3713. aufgebaut werden können. Die Bitmap enthält in diesem Fall nur einen Teil des
  3714. Zeichens.
  3715.  
  3716. Man sollte diese Funktion nicht mi₧brauchen, um eine eigene Textausgabe zu
  3717. bauen - es lohnt sich nicht und Pair-Kerning wäre auch nicht möglich.
  3718.  
  3719.  
  3720. ∙ INQUIRE OUTLINE FONT TEXT EXTENT (VDI 240)
  3721.  
  3722. Ebenso wie bei vqt_extent() werden hier die Zeichenweiten addiert. Diese
  3723. Funktion beachtet aber Track- und Pair-Kerning und arbeitet intern mit 1/65536
  3724. Pixeln, d.h. erst bei der Umrechnung in Koordinaten wird gerundet. Texteffekte
  3725. wie z.B. Neigung über vst_skew() werden ebenso wie linke und rechte Überhänge
  3726. nicht beachtet.
  3727.  
  3728. Dekl.:  void vqt_f_extent( WORD handle, BYTE *string, WORD *extent );
  3729. Aufruf: vqt_f_extent( handle, string, extent );
  3730.  
  3731. Variable         Belegung            Bedeutung
  3732. Eingaben:
  3733.  
  3734. contrl[0]        240                 vqt_fextent
  3735. contrl[1]        0                   Einträge in ptsin
  3736. contrl[3]        n                   Einträge in intin
  3737. contrl[6]        handle
  3738. intin[0..n-1]    string[0..n-1]      Zeichenkette
  3739.  
  3740. Ausgaben:
  3741.  
  3742. contrl[2]        4                   Einträge in ptsout
  3743. contrl[4]        0                   Einträge in intout
  3744. ptsout[0..7]     extent[0..7]        Koordinaten des Textrechtecks
  3745.  
  3746. Fallen:
  3747. Aus Kompatibilitätsgründen verhält sich diese Funktion bei 90, 180 und 270 Grad
  3748. genauso unsinnig wie das alte vqt_extent() - der Bezugspunkt wird geändert!
  3749.  
  3750. Bemerkungen:
  3751. Diese Funktion liefert nicht das den Text umgebende Rechteck. Sie addiert nur
  3752. die Schrittweiten und beachtet auch nicht linke oder rechte Zeichenüberhänge.
  3753. Sie ist im Prinzip nur zur Cursor-Positionierung gedacht. Wer aber mit dieser
  3754. Funktion die Grö₧e eines neuzuzeichenenden Bildbereichs ermitteln möchte, mu₧
  3755. links und rechts sicherheitshalber die Breite des grö₧ten Zeichens hinzuaddieren
  3756. (und die Neigung beachten). Unter NVDI 3 empfiehlt sich stattdessen die
  3757. Verwendung von vqt_real_extent().
  3758.  
  3759.  
  3760. ∙ INQUIRE REAL OUTLINE FONT TEXT EXTENT (VDI 240, 4200)
  3761.  
  3762. Diese Funktion wird z.Zt. nur von NVDI bereitgestellt.
  3763. Es wird das umgebende Viereck (es mu₧ sich nicht immer um ein Rechteck handeln)
  3764. für Textausgabe an der Stelle x,y zurückgeliefert. Dabei werden sämtliche
  3765. Texteffekte, Rotation, Schrägstellung, Pair-Kerning, Track-Kerning,
  3766. Zeichenüberhänge, horizontale und vertikale Ausrichtung berücksichtigt.
  3767.  
  3768. Dekl.:  void vqt_real_extent( WORD handle, WORD x, WORD y, BYTE *string,
  3769.                               WORD *extent );
  3770. Aufruf: vqt_real_extent( handle, x, y, string, extent )
  3771.  
  3772. Variable         Belegung            Bedeutung
  3773. Eingaben:
  3774.  
  3775. contrl[0]        240                 vqt_fextent
  3776. contrl[1]        1                   Einträge in ptsin
  3777. contrl[3]        n                   Einträge in intin
  3778. contrl[5]        4200                Unterfunktionsnummer
  3779. contrl[6]        handle
  3780. ptsin[0]         x                   x-Koordinate
  3781. ptsin[1]         y                   y-Koordinate
  3782. intin[0..n-1]    string[0..n-1]      Zeichenkette
  3783.  
  3784. Ausgaben:
  3785.  
  3786. contrl[2]        4                   Einträge in ptsout
  3787. contrl[4]        0                   Einträge in intout
  3788. ptsout[0..7]     extent[0..7]        Koordinaten des umgebenden Textrechtecks
  3789.  
  3790.  
  3791. ∙ OUTLINE  FONT TEXT (VDI 241)
  3792.  
  3793. Diese Textausgabefunktion beachtet im Gegensatz zu v_gtext() Pair- und
  3794. Track-Kerning und berechnet intern die Zeichenpositionen in 1/65536 Pixeln,
  3795. wodurch eine bessere Zeichenpositionierung gewährleistet wird.
  3796.  
  3797. Dekl.:  void v_ftext( WORD handle, WORD x, WORD y, BYTE *string );
  3798. Aufruf: v_ftext( handle, x, y, string );
  3799.  
  3800. Variable         Belegung            Bedeutung
  3801. Eingaben:
  3802.  
  3803. contrl[0]        241                 v_ftext
  3804. contrl[1]        1                   Einträge in ptsin
  3805. contrl[3]        n                   Einträge in intin
  3806. contrl[6]        handle
  3807. intin[0..n-1]    string[0..n-1]      Zeichenkette
  3808. ptsin[0]         x
  3809. ptsin[1]         y
  3810.  
  3811. Ausgaben:
  3812.  
  3813. contrl[2]        0                   Einträge in ptsout
  3814. contrl[4]        0                   Einträge in intout
  3815.  
  3816. Es gibt für v_ftext() noch eine weitere Variante, bei der man für jedes Zeichen
  3817. den Abstand zum Vorgänger selbst bestimmen kann:
  3818.  
  3819. Dekl.:  void v_ftext_offset( WORD handle, WORD x, WORD y, BYTE *string, WORD *offset );
  3820. Aufruf: v_ftext_offset( handle, x, y, string, offset );
  3821.  
  3822. Variable         Belegung            Bedeutung
  3823. Eingaben:
  3824.  
  3825. contrl[0]        241                 v_ftext
  3826. contrl[1]        1+n                 Einträge in ptsin
  3827. contrl[3]        n                   Einträge in intin
  3828. contrl[6]        handle
  3829. intin[0..n-1]    string[0..n-1]      Zeichenkette
  3830. ptsin[0]         x
  3831. ptsin[1]         y
  3832. ptsin[2]         offset[0]           x-Offset des ersten Zeichens
  3833. ptsin[3]         offset[1]           y-Offset des ersten Zeichens
  3834. ptsin[4..2*n+1]  xyoff[2..(2*n)-1]   x-Offset, y-Offset der folgenden Zeichen
  3835.  
  3836. Ausgaben:
  3837.  
  3838. contrl[2]        0                   Einträge in ptsout
  3839. contrl[4]        0                   Einträge in intout
  3840.  
  3841.  
  3842. ∙ Get Character outline (VDI 243)
  3843.  
  3844. Die Funktion v_getoutline() generiert aus einem Zeichen einen Bezierzug, mit dem
  3845. man v_bez() oder v_bezfill() aufrufen kann.
  3846.  
  3847. Dekl.:  void v_getoutline( WORD handle, WORD index, WORD *xyarr, BYTE *bezarr,
  3848.                            WORD max_pts, WORD *count );
  3849. Aufruf: v_getoutline( handle, index, xyarr, bezarr, max_pts, &count );
  3850.  
  3851. Variable         Belegung            Bedeutung
  3852. Eingaben:
  3853.  
  3854. contrl[0]        243                 v_getoutline
  3855. contrl[1]        0                   Einträge in ptsin
  3856. contrl[3]        6                   Einträge in intin
  3857. contrl[6]        handle
  3858. intin[0]         index               Zeichen-Index
  3859. intin[1]         max_pts             Maximale auszugebende Punktanzahl
  3860. intin[2..3]      xyarray             Buffer für die Koordinaten
  3861. intin[4..5]      bezarray            Buffer für Punktinformationen (jump, bez)
  3862.  
  3863. Ausgaben:
  3864.  
  3865. contrl[2]        0                   Einträge in ptsout
  3866. contrl[4]        0                   Einträge in intout
  3867. intout[0]        count               Anzahl der ausgegebenen Punkte
  3868.  
  3869. Bemerkungen:
  3870. Wenn man die Informationen von v_getoutline() z.B. als Vektorgrafik benutzen
  3871. möchte, so empfiehlt es sich, vor dem Aufruf eine gro₧e Texthöhe einzustellen.
  3872. Andernfalls ist die Qualität des zurückgelieferten Beziers recht mager, da von
  3873. der internen Darstellung in 1/65536 Pixeln auf Pixel gerundet wird, d.h. 16 Bit
  3874. fallen weg.
  3875.  
  3876.  
  3877. ∙ SET CHARACTER HEIGHT BY ARBITRARY POINTS (VDI 246)
  3878.  
  3879. Ähnlich wie vst_point() kann man mit dieser Funktion die Zeichenhöhe in Punkten
  3880. setzen. Man ist aber nicht an die Standard-Grö₧en gebunden, sondern kann die
  3881. Höhe in 1/65536 Punkten (pt) anwählen. Wenn man negative Grö₧en einstellt,
  3882. werden die Zeichen and der x-Achse gespiegelt.
  3883.  
  3884. Dekl.:  fix31 vst_arbpt( WORD handle, fix31 height,
  3885.                          WORD *char_width, WORD *char_height,
  3886.                          WORD *cell_width, WORD *cell_height );
  3887. Aufruf: set_point = vst_arbpt( handle, height, &char_width, &char_height,
  3888.                                &cell_width, &cell_height );
  3889.  
  3890. Variable         Belegung            Bedeutung
  3891. Eingaben:
  3892.  
  3893. contrl[0]        246                 vst_arbpt
  3894. contrl[1]        0                   Einträge in ptsin
  3895. contrl[3]        2                   Einträge in intin
  3896. contrl[6]        handle
  3897. intin[0..1]      height              Höhe in 1/65536 Punkten
  3898.  
  3899. Ausgaben:
  3900.  
  3901. contrl[2]        2                   Einträge in ptsout
  3902. contrl[4]        2                   Einträge in intout
  3903. intout[0..1]     set_point           eingestellte Höhe in 1/65536 Punkten
  3904. ptsout[0]        char_width          ausgewählte Zeichenbreite
  3905. ptsout[1]        char_height         ausgewählte Zeichenhöhe
  3906. ptsout[2]        cell_width          ausgewählte Zeichenzellenbreite
  3907. ptsout[3]        cell_height         ausgewählte Zeichenzellenhöhe
  3908.  
  3909. Bemerkungen:
  3910. Bei den zurückgelieferten Zeichenbreiten handelt es sich um gerundete Werte, die
  3911. man nicht ohne weiteres zur Breitenberechnung benutzen kann.
  3912.  
  3913.  
  3914. ∙ INQUIRE OUTLINE FONT TEXT ADVANCE PLACEMENT VECTOR (VDI 247)
  3915.  
  3916. Diese Funktion liefert für ein Zeichen x- und y-Komponente für die
  3917. Positionierung des folgenden Zeichens (es handelt sich nicht um die Breite des
  3918. Zeichens!).
  3919.  
  3920. Dekl.:  void  vqt_advance( WORD handle, WORD index,
  3921.                             fix31 *x_advance, fix31 *y_advance );
  3922. Aufruf: vqt_advance( handle, index, &x_advance, &y_advance );
  3923.  
  3924. Variable         Belegung            Bedeutung
  3925. Eingaben:
  3926.  
  3927. contrl[0]        247                 vqt_advance
  3928. contrl[1]        0                   Einträge in ptsin
  3929. contrl[3]        2                   Einträge in intin
  3930. contrl[6]        handle
  3931. intin[0]         index               Zeichen-Index
  3932.  
  3933. Ausgaben:
  3934.  
  3935. contrl[2]        4                   Einträge in ptsout
  3936. contrl[4]        0                   Einträge in intout
  3937. ptsout[0]        x_adv_old           x-Abstand in Pixeln
  3938. ptsout[1]        y_adv_old           y-Abstand in Pixeln
  3939. ptsout[2]        x_rem_old           x-Nachkommarest (mod 16384)
  3940. ptsout[3]        y_rem_old           y-Nachkommarest (mod 16384)
  3941. ptsout[4..5]     x_advance           x-Abstand in 1/65536 Pixeln
  3942. ptsout[6..7]     y_advance           y-Abstand in 1/65536 Pixeln
  3943.  
  3944. Bemerkungen:
  3945. Die Werte in ptsout[0..3] werden nur noch aus Kompatibilitätsgründen
  3946. zurückgliefert. Stattdessen sollten x_advance und y_advance im genaueren
  3947. fix31-Format benutzt werden.
  3948. Es handelt sich bei x_advance und y_advance nur um den Abstand, der für die
  3949. Positionierung des nächsten Zeichens benutzt wird, d.h. x_advance beinhaltet
  3950. keine Zeichenüberhänge.
  3951.  
  3952.  
  3953. ∙ FLUSH OUTLINE FONT CACHE (VDI 251)
  3954.  
  3955. Diese Funktion löscht die Fontcaches - Prädikat besonders wertvoll :-)
  3956.  
  3957.  
  3958. ∙ SET CHARACTER CELL WIDTH BY ARBITRARY POINTS (VDI 252)
  3959.  
  3960. Vst_setsize() setzt die Zeichenbreite in 1/65536 Punkten (pt). Die Zeichenbreite
  3961. wird beim nächsten Aufruf von vst_height(), vst_point oder vst_arbpt() wieder
  3962. zurückgesetzt. Bei negativen Breiten werden die Zeichen an der y-Achse gespiegelt.
  3963.  
  3964. Dekl.:  fix31 vst_setsize( WORD handle, fix31 width,
  3965.                            WORD *char_width, WORD *char_height,
  3966.                            WORD *cell_width, WORD *cell_height );
  3967. Aufruf: set_width = vst_setsize( handle, width, &char_width, &char_height,
  3968.                                  &cell_width, &cell_height );
  3969.  
  3970. Variable         Belegung            Bedeutung
  3971. Eingaben:
  3972.  
  3973. contrl[0]        252                 vst_setsize
  3974. contrl[1]        0                   Einträge in ptsin
  3975. contrl[3]        2                   Einträge in intin
  3976. contrl[6]        handle
  3977. intin[0..1]      width               Zeichenbreite in 1/65536 Punkten
  3978.  
  3979. Ausgaben:
  3980.  
  3981. contrl[2]        2                   Einträge in ptsout
  3982. contrl[4]        2                   Einträge in intout
  3983. intout[0..1]     set_width           eingestellte Breite in 1/65536 Punkten
  3984. ptsout[0]        char_width          ausgewählte Zeichenbreite
  3985. ptsout[1]        char_height         ausgewählte Zeichenhöhe
  3986. ptsout[2]        cell_width          ausgewählte Zeichenzellenbreite
  3987. ptsout[3]        cell_height         ausgewählte Zeichenzellenhöhe
  3988.  
  3989.  
  3990. ∙ SET OUTLINE FONT SKEW (VDI 253)
  3991.  
  3992. Mit dieser Funktion können Zeichen unabhängig von vst_effects() in
  3993. 1/10-Grad-Schritten zwischen -90 und +90 Grad geneigt werden. Wie überall im VDI
  3994. sind auch hier die Winkel entgegen dem Uhrzeigersinn gerichtet. Positive Winkel
  3995. führen zu einer Neigung nach links, wogegen negative Winkel Zeichen nach rechts
  3996. neigen.
  3997.  
  3998. Dekl.:  WORD  vst_skew( WORD handle, WORD skew );
  3999. Aufruf: set_skew = vst_skew( handle, skew );
  4000.  
  4001. Variable         Belegung            Bedeutung
  4002. Eingaben:
  4003.  
  4004. contrl[0]        253                 vst_skew
  4005. contrl[1]        0                   Einträge in ptsin
  4006. contrl[3]        1                   Einträge in intin
  4007. contrl[6]        handle
  4008. intin[0]         skew                Neigung in 1/10-Grad
  4009.  
  4010. Ausgaben:
  4011.  
  4012. contrl[2]        0                   Einträge in ptsout
  4013. contrl[4]        1                   Einträge in intout
  4014. intout[0]        set_skew            eingestellte Neigung in 1/10-Grad
  4015.  
  4016. Bemerkungen:
  4017. Diese Funktion ist zwar eine ganz nette Spielerei, aber die erzeugten Zeichen
  4018. sehen grundsätzlich schlechter aus als ein richtiger italic-Font.
  4019.  
  4020.  
  4021.  
  4022.  
  4023. Rasterfunktionen
  4024. ================
  4025.  
  4026. ∙ COPY RASTER, OPAQUE (VDI 109)
  4027.  
  4028. "COPY RASTER, OPAQUE" kopiert pixelweise ein rechteckiges Raster auf ein anderes
  4029. rechteckiges Raster. Hierbei werden die angegebenen logischen Verknüpfungen
  4030. beachtet. Beide Raster müssen entweder im gerätespezifischen Format vorliegen
  4031. oder dürfen nur 1 Ebene haben.
  4032.  
  4033. Immer dann, wenn der Bildschirm (oder das Gerät, das durch <handle> angesprochen
  4034. wird), Quelle oder Ziel einer Rasteroperation ist, sollte fd_addr des MFDB auf
  4035. NULL gesetzt sein!
  4036.  
  4037. Im Zielraster wird nur geclippt, wenn fd_addr des Ziel-MFDBs NULL ist!
  4038.  
  4039. Das Quellraster wird (bisher) nicht geclippt!
  4040.  
  4041. Dekl.:  void vro_cpyfm( WORD handle, WORD vr_mode, WORD *xyarr,
  4042.                         MFDB *src_MFDB, MFDB *des_MFDB );
  4043. Aufruf: vro_cpyfm( handle, wr_mode, xyarr, &src_MFDB, &des_MFDB );
  4044.  
  4045. Variable         Belegung            Bedeutung
  4046. Eingaben:
  4047.  
  4048. contrl[0]        109                 vro_cpyfm
  4049. contrl[1]        4                   Einträge in ptsin
  4050. contrl[3]        1                   Einträge in intin
  4051. contrl[6]        handle
  4052. contrl[7..8]     src_MFDB            Zeiger auf den MFDB des Quellrasters
  4053. contrl[9..10]    des_MFDB            Zeiger auf den MFDB des Zielrasters
  4054. intin[0]         wr_mode             logische Verknüpfung
  4055. ptsin[0..7]      xyarr[0..7]         Koordinaten
  4056.  
  4057. Ausgaben:
  4058.  
  4059. contrl[2]        0                   Einträge in ptsout
  4060. contrl[4]        0                   Einträge in intout
  4061.  
  4062. Bedeutung von wr_mode (logische Verknüpfungen):
  4063. 0:  Ergebnis=0
  4064. 1:  Ergebnis=Quelle and Ziel
  4065. 2:  Ergebnis=Quelle and (not Ziel)
  4066. 3:  Ergebnis=Quelle
  4067. 4:  Ergebnis=(not Quelle) and Ziel
  4068. 5:  Ergebnis=Ziel (sinnlos!)
  4069. 6:  Ergebnis=Quelle xor Ziel
  4070. 7:  Ergebnis=Quelle or Ziel
  4071. 8:  Ergebnis=not (Quelle or Ziel)
  4072. 9:  Ergebnis=not (Quelle xor Ziel)
  4073. 10: Ergebnis=not Ziel
  4074. 11: Ergebnis=Quelle or (not Ziel)
  4075. 12: Ergebnis=not Quelle
  4076. 13: Ergebnis=(not Quelle) or Ziel
  4077. 14: Ergebnis=not (Quelle and Ziel)
  4078. 15: Ergebnis=1
  4079.  
  4080. Bedeutung von xyarr:
  4081. xyarr[0..3]: Koordinaten des Quellrechtecks
  4082. xyarr[4..7]: Koordinaten des Zielrechtecks
  4083.  
  4084.  
  4085. ∙ COPY RASTER, TRANSPARENT (VDI 121)
  4086.  
  4087. Diese Funktion expandiert unter Berücksichtigung von Vorder -und
  4088. Hintergrundfarbe sowie des Schreibmodus ein zweifarbiges (aus einer Ebene
  4089. bestehendes) Quellraster zu einem mehrfarbigen Zielraster.
  4090.  
  4091. Ebenso wie bei vro_cpyfm() sollte auch bei vrt_cpyfm() fd_addr 0 sein, wenn der
  4092. Bildschirm Ziel einer Rasteroperation ist!
  4093.  
  4094. Dekl.:  void vrt_cpyfm( WORD handle, WORD wr_mode, WORD *xyarr,
  4095.                         MFDB *src_MFDB, MFDB *des_MFDB, WORD *color_index );
  4096. Aufruf: vrt_cpyfm( handle, wr_mode, xyarr, &src_MFDB, &des_MFDB, color_index );
  4097.  
  4098. Variable         Belegung            Bedeutung
  4099. Eingaben:
  4100.  
  4101. contrl[0]        121                 vrt_cpyfm
  4102. contrl[1]        4                   Einträge in ptsin
  4103. contrl[3]        3                   Einträge in intin
  4104. contrl[6]        handle
  4105. contrl[7..8]     src_MFDB            Zeiger auf den MFDB des Quellrasters
  4106. contrl[9..10]    des_MFDB            Zeiger auf den MFDB des Zielrasters
  4107. intin[0]         wr_mode             Schreibmodus
  4108. intin[1]         color_index[0]      Farbindex der gesetzten Punkte
  4109. intin[2]         color_index[1]      Farbindex der gelöschten Punkte
  4110. ptsin[0..7]      xyarr[0..7]         Koordinaten
  4111.  
  4112. Ausgaben:
  4113.  
  4114. contrl[2]        0                   Einträge in ptsout
  4115. contrl[4]        0                   Einträge in intout
  4116.  
  4117. Bedeutung von xyarr:
  4118. xyarr[0..3]: Koordinaten des Quellrechtecks
  4119. xyarr[4..7]: Koordinaten des Zielrechtecks
  4120.  
  4121.  
  4122. ∙ TRANSFORM FORM (VDI 110)
  4123.  
  4124. Diese Funktion transformiert ein Raster vom Standardformat ins gerätespezifische
  4125. Format und umgekehrt. Die Transformation kann "in place" geschehen, d.h. beide
  4126. MFDBs zeigen auf den gleichen Speicherbereich - in diesem Fall dauert aber
  4127. gerade das Transformieren gro₧er Blöcke ewig.
  4128.  
  4129. Dekl.:  void vr_trnfm( WORD handle, MFDB *src_MFDB, MFDB *des_MFDB );
  4130. Aufruf: vr_trnfm( handle, &src_MFDB, &des_MFDB );
  4131.  
  4132. Variable         Belegung            Bedeutung
  4133. Eingaben:
  4134.  
  4135. contrl[0]        110                 vr_trnfm
  4136. contrl[1]        0                   Einträge in ptsin
  4137. contrl[2]        0                   Einträge in ptsout
  4138. contrl[3]        0                   Einträge in intin
  4139. contrl[4]        0                   Einträge in intout
  4140. contrl[6]        handle
  4141. contrl[7...8]    psrcMFDB            Zeiger auf den MFDB des Quellrasters
  4142. contrl[9...10]   pdesMFDB            Zeiger auf den MFDB des Zielrasters
  4143.  
  4144.  
  4145. ∙ GET PIXEL (VDI 105)
  4146.  
  4147. Für bis zu 8 Farbebenen (256 gleichzeitig darstellbare Farben) ermittelt "GET
  4148. PIXEL" den Zustand (gelöscht/gesetzt) und die Farbe eines Pixels.
  4149.  
  4150. Bei HiColor (15- oder 16-Bit) enthält pel den Pixelwert und index ist (meistens)
  4151. -1, da er nicht einwandfrei zuzuordnen ist.
  4152.  
  4153. Bei TrueColor enthält pel das Low-Word des Pixelwerts und index das High-Word.
  4154.  
  4155. Dekl.:  void v_get_pixel( WORD handle, WORD x, WORD y, WORD *pel, WORD *index );
  4156. Aufruf: v_get_pixel( handle, x, y, &pel, & index );
  4157.  
  4158. Variable         Belegung            Bedeutung
  4159. Eingaben:
  4160.  
  4161. contrl[0]        105                 v_get_pixel
  4162. contrl[1]        1                   Einträge in ptsin
  4163. contrl[3]        0                   Einträge in intin
  4164. contrl[6]        handle
  4165. ptsin[0]         x
  4166. ptsin[1]         y
  4167.  
  4168. Ausgaben:
  4169.  
  4170. contrl[2]        0                   Einträge in ptsout
  4171. contrl[4]        2                   Einträge in intout
  4172. intout[0]        pel                 Pixelwert
  4173. intout[1]        index               Farbindex des Pixels
  4174.  
  4175.  
  4176. Rasteroperationen bei Off-Screen-Bitmaps:
  4177.  
  4178. Rasteroperationen zwischen Bildschirm und Off-Screen-Bitmap sollten
  4179. grundsätzlich im gerätespezifischen Format erfolgen.
  4180. Wenn als Ziel einer Rasteroperation eine Off-Screen-Bitmap mit ihrem MFDB
  4181. angegeben wird und wenn das zu dieser Bitmap gehörende Handle benutzt wird, so
  4182. wird beim Transfer anhand der über vs_clip() auf dieser Workstation
  4183. eingestellten Koordinaten geclippt. Für das Kopieren eines Rasters vom
  4184. Bildschirm in eine Off-Screen-Bitmap sollte man also das VDI-Handle dieser
  4185. Bitmap benutzen.
  4186. Ist die Bitmap dagegen Quelle und der Bildschirm Ziel, so sollte man das Handle
  4187. der Bildschirm-Workstaion benutzen, da dann das Raster anhand der
  4188. Bildschirm-Koordinaten abgeclippt wird. Wenn man das von v_opnbm()
  4189. zurückgelieferte Handle einer Bitmap benutzt und in fd_addr in einem MFDB 0
  4190. enthält, so werden die Daten der Bitmap statt dessen benutzt.
  4191.  
  4192.  
  4193.  
  4194.  
  4195. Eingabefunktionen
  4196. =================
  4197.  
  4198. Die Eingabefunktionen ermöglichen einem Programm, unter Berücksichtigung der
  4199. Eingabemodi Tastatur und Maus abzufragen. Au₧erdem bieten sie Routinen zum
  4200. einenklinken in Timer- und Maus- Interrupts.
  4201.  
  4202. Diese Funktionen sind primär für den Eigner der physikalischen Workstation, d.h.
  4203. für das AES gedacht. Applikationen sollten, sofern es keine zwingenden Gründe
  4204. für ein anderes Vorgehen gibt, Maus- und Tastaturereignisse immer durch die
  4205. Event-Funktionen des AES abfragen, da andernfalls für andere Applikationen
  4206. bestimmte Eingaben abgefangen werden.
  4207.  
  4208.  
  4209. ∙ SET INPUT MODE (VDI 33)
  4210.  
  4211. Mit "SET INPUT MODE" kann man für ein bestimmtes Eingabegerät den Eingabemodus
  4212. festlegen.
  4213.  
  4214. Dekl.:  void vsin_mode( WORD handle, WORD dev_type, WORD mode );
  4215. Aufruf: vsin_mode( handle, dev_type, mode );
  4216.  
  4217. Variable         Belegung            Bedeutung
  4218. Eingaben:
  4219.  
  4220. contrl[0]        33                  vsin_mode
  4221. contrl[1]        0                   Einträge in ptsin
  4222. contrl[3]        2                   Einträge in intin
  4223. contrl[6]        handle
  4224. intin[0]         dev_type            Eingabeeinheit
  4225. intin[1]         mode                gewünschter Eingabemodus
  4226.  
  4227. Ausgaben:
  4228.  
  4229. contrl[2]        0                   Einträge in ptsout
  4230. contrl[4]        1                   Einträge in intout
  4231. intout[0]        set_mode            ausgewählter Eingabemodus
  4232.  
  4233. Bedeutung von dev_type:
  4234. 1: Maus
  4235. 2: Cursor
  4236. 3: Funktionstasten
  4237. 4: Tastatur
  4238.  
  4239. Bedeutung von mode:
  4240. REQUEST MODE   1: Eingabeeinheit abfragen und sofort den Eingabewert und den
  4241.                   Status zurückgeben.
  4242. SAMPLE MODE    2: Warten bis eine Eingabe erfolgt und dann den Eingabewert
  4243.                   zurückgeben.
  4244.  
  4245.  
  4246. ∙ INPUT LOCATOR, REQUEST MODE (VDI 28)
  4247.  
  4248. Mit dieser Funktion wird die Position des Mauszeigers ermittelt und eine neue
  4249. Position übergeben. Der Mauszeiger wird erst nach Druck einer Maustaste neu
  4250. positioniert.
  4251.  
  4252. Dekl.:  void vrq_locator( WORD handle, WORD x, WORD y, WORD *xout,
  4253.                                WORD *yout, WORD *term );
  4254. Aufruf: vrq_locator( handle, x, y, &xout, &yout, &term );
  4255.  
  4256. Variable         Belegung            Bedeutung
  4257. Eingaben:
  4258.  
  4259. contrl[0]        28                  vrq_locator
  4260. contrl[1]        1                   Einträge in ptsin
  4261. contrl[3]        0                   Einträge in intin
  4262. contrl[6]        handle
  4263. ptsin[0]         x                   neue x-Koordinate des Mauszeigers
  4264. ptsin[1]         y                   neue y-Koordinate des Mauszeigers
  4265.  
  4266. Ausgaben:
  4267.  
  4268. contrl[2]        1                   Einträge in ptsout
  4269. contrl[4]        1                   Einträge in intout
  4270. intout[0]        term                Maustastenstatus+31
  4271. ptsout[0]        xout                alte x-Koordinate des Mauszeigers
  4272. ptsout[1]        yout                alte y-Koordinate des Mauszeigers
  4273.  
  4274.  
  4275. ∙ INPUT LOCATOR, SAMPLE MODE (VDI 28)
  4276.  
  4277. Mit dieser Funktion wird die Position des Mauszeigers ermittelt und eine  neue
  4278. Position  übergeben.  Tastenbetätigungen  oder Mausposition  werden  nur  dann
  4279. gemeldet, wenn sie wirklich erfolgt sind.
  4280.  
  4281. Dekl.:  WORD vsm_locator( WORD handle,  WORD x,  WORD y,  WORD *xout,
  4282.                           WORD *yout, WORD *term );
  4283. Aufruf: status = vsm_locator( handle, x, y, &xout, &yout, &term );
  4284.  
  4285. Variable         Belegung            Bedeutung
  4286. Eingaben:
  4287.  
  4288. contrl[0]        28                  vsm_locator
  4289. contrl[1]        1                   Einträge in ptsin
  4290. contrl[3]        0                   Einträge in intin
  4291. contrl[6]        handle
  4292. ptsin[0]         x                   neue x-Koordinate des Mauszeigers
  4293. ptsin[1]         y                   neue y-Koordinate des Mauszeigers
  4294.  
  4295. Ausgaben:
  4296.  
  4297. contrl[2]        0 oder 1            Einträge in ptsout
  4298. contrl[4]        0 oder 1            Einträge in intout
  4299. intout[0]        term                Maustastenstatus+31
  4300. ptsout[0]        xout                alte x-Koordinate des Mauszeigers
  4301. ptsout[1]        yout                alte y-Koordinate des Mauszeigers
  4302.  
  4303. Bedeutung von status (gebildet aus (contrl[4]<<1)|contrl[2]) (Bitnummer):
  4304. 0: Positionsveränderung
  4305. 1: Tastendruck
  4306.  
  4307.  
  4308. ∙ INPUT CHOICE, REQUEST MODE (VDI 30)
  4309.  
  4310. Mit  dieser Funktion wird die Betätigung einer Funktionstaste  abgewartet  und
  4311. die Tastennummer (1-10) zurückgegeben.
  4312.  
  4313. Dekl.:  void vrq_choice( WORD handle, WORD ch_in, WORD *ch_out );
  4314. Aufruf: vrq_choice( handle, ch_in, &ch_out );
  4315.  
  4316. Variable         Belegung            Bedeutung
  4317. Eingaben:
  4318.  
  4319. contrl[0]        30                  vrq_choice
  4320. contrl[1]        0                   Einträge in ptsin
  4321. contrl[3]        1                   Einträge in intin
  4322. contrl[6]        handle
  4323. intin[0]         ch_in               initialisierende Taste (0)
  4324.  
  4325. Ausgaben:
  4326.  
  4327. contrl[2]        0                   Einträge in ptsout
  4328. contrl[4]        1                   Einträge in intout
  4329. intout[0]        ch_out              ausgewählte Funktionstaste
  4330.  
  4331.  
  4332. ∙ INPUT CHOICE, SAMPLE MODE (VDI 30)
  4333.  
  4334. Sofern   eine  Funktionstaste  betätigt  wurde,   gibt  dieser  Funktion   die
  4335. Tastennummer (1-10) zurück.
  4336.  
  4337. Dekl.:  WORD vsm_choice( WORD handle, WORD *choice );
  4338. Aufruf: status = vsm_choice( handle, &choice );
  4339.  
  4340. Variable         Belegung            Bedeutung
  4341. Eingaben:
  4342.  
  4343. contrl[0]        30                  vsm_choice
  4344. contrl[1]        0                   Einträge in ptsin
  4345. contrl[3]        0                   Einträge in intin
  4346. contrl[6]        handle
  4347.  
  4348. Ausgaben:
  4349.  
  4350. contrl[2]        0                   Einträge in ptsout
  4351. contrl[4]        0 oder 1            Einträge in intout
  4352. intout[0]        choice              Tastennummer
  4353.  
  4354. Bedeutung von status (contrl[4]):
  4355. 0: kein Tastendruck
  4356. 1: Tastendruck erfolgt
  4357.  
  4358.  
  4359. ∙ INPUT STRING,REQUEST MODE (VDI 31)
  4360.  
  4361. Diese Funktion gibt eine Zeichenkette von der Tastatur zurück, wenn RETURN
  4362. gedrückt oder die maximale Länge erreicht wird.
  4363.  
  4364. Dekl.:  void vrq_string( WORD handle, WORD max_length, WORD echo_mode,
  4365.                               WORD *echo_xy, BYTE *string );
  4366. Aufruf: vrq_string( handle, max_length, echo_mode, echo_xy, string );
  4367.  
  4368. Variable         Belegung            Bedeutung
  4369. Eingaben:
  4370.  
  4371. contrl[0]        31                  vrq_string
  4372. contrl[1]        1                   Einträge in ptsin
  4373. contrl[3]        2                   Einträge in intin
  4374. contrl[6]        handle
  4375. intin[0]         max_length          maximale Länge der Zeichenkette
  4376. intin[1]         echo_mode           0: keine Ausgabe, 1: Ausgabe
  4377. ptsin[0]         echo_xy[0]
  4378. ptsin[1]         echo_xy[1]
  4379.  
  4380. Ausgaben:
  4381.  
  4382. contrl[2]        0                   Einträge in ptsout
  4383. contrl[4]        n                   Einträge in intout
  4384. intout[0..n-1]   string[0..n-1]      Eingabepuffer
  4385.  
  4386. Bedeutung von max_length:
  4387. max_length gibt die maximale Länge der Zeichenkette an. Ist max_length negativ,
  4388. so wird der Absolutbetrag als Länge betrachtet, und statt der ASCII-Codes werden
  4389. Scan-Codes übergeben.
  4390.  
  4391.  
  4392. ∙ INPUT STRING,SAMPLE MODE (VDI 31)
  4393.  
  4394. Diese Funktion gibt eine Zeichenkette von der Tastatur  zurück, wenn RETURN
  4395. gedrückt oder die maximale Länge erreicht wird. Sofern keine Eingaben gemacht
  4396. werden, bricht die Funktion ab.
  4397.  
  4398. Dekl.:  WORD vsm_string( WORD handle, WORD max_length, WORD echo_mode,
  4399.                              WORD *echo_xy, BYTE *string );
  4400. Aufruf: status = vsm_string( handle,  max_length, echo_mode, echo_xy, string );
  4401.  
  4402. Variable         Belegung            Bedeutung
  4403. Eingaben:
  4404.  
  4405. contrl[0]        31                  vsm_string
  4406. contrl[1]        1                   Einträge in ptsin
  4407. contrl[3]        2                   Einträge in intin
  4408. contrl[6]        handle
  4409. intin[0]         max_length          maximale Länge der Zeichenkette
  4410. intin[1]         echo_mode           0: keine Ausgabe, 1: Ausgabe
  4411. ptsin[0]         echo_xy[0]
  4412. ptsin[1]         echo_xy[1]
  4413.  
  4414. Ausgaben:
  4415.  
  4416. contrl[2]        0                   Einträge in ptsout
  4417. contrl[4]        n                   Einträge in intout
  4418. intout[0..n-1]   string[0..n-1]      Eingabepuffer
  4419.  
  4420. Bedeutung von max_length:
  4421. max_length  gibt  die  maximale Länge  der  Zeichenkette  an.  Ist  max_length
  4422. negativ,  so  wird der Absolut-Betrag als Länge benutzt und statt  der  ASCII-
  4423. Codes werden Scan-Codes übergeben.
  4424.  
  4425. Bedeutung von status (contrl[4]):
  4426. 0:    keine Eingabe
  4427. <> 0: Länge der Zeichenkette
  4428.  
  4429.  
  4430. ∙ SET MOUSE FORM (VDI 111)
  4431.  
  4432. Das Aussehen des Mauszeigers kann mit "SET MOUSE FORM" frei definiert werden.
  4433.  
  4434. Dekl.:  void vsc_form( WORD handle, WORD *cursor );
  4435. Aufruf: vsc_form( handle, cursor );
  4436.  
  4437. Variable         Belegung            Bedeutung
  4438. Eingaben:
  4439.  
  4440. contrl[0]        111                 vsc_form
  4441. contrl[1]        0                   Einträge in ptsin
  4442. contrl[3]        37                  Einträge in intin
  4443. contrl[6]        handle
  4444. intin[0..36]     cursor[0..36]       Mauszeigerdefinition
  4445.  
  4446. Ausgaben:
  4447.  
  4448. contrl[2]        0                   Einträge in ptsout
  4449. contrl[4]        0                   Einträge in intout
  4450.  
  4451. Bedeutung von cursor:
  4452. pcur_form[0]:       relative Koordinate des horizontalen Aktionspunktes
  4453. pcur_form[1]:       relative Koordinate des vertikalen Aktionspunktes
  4454. pcur_form[2]:       mu₧ 1 sein (REPLACE)
  4455. pcur_form[3]:       Farbindex der Hintergrundmaske
  4456. pcur_form[4]:       Farbindex der Vordergrundmaske
  4457. pcur_form[5..20]:   Hintergrundmaske
  4458. pcur_form[21..36]:  Vordergrundmaske
  4459.  
  4460. Bemerkung:
  4461. Zum Setzen der Mausform sollte in GEM-Programmen unbedingt die AES-Funktion
  4462. graf_mouse() verwendet werden.  Andernfalls wird die Mausform-Verwaltung des AES
  4463. nachhaltig verwirrt.
  4464.  
  4465. Mit NVDI ist es möglich, die aktuelle Mausform zurückgeliefert zu bekommen.
  4466.  
  4467. Variable         Belegung            Bedeutung
  4468. Eingaben:
  4469.  
  4470. contrl[0]        111                 vgc_form
  4471. contrl[1]        0                   Einträge in ptsin
  4472. contrl[3]        0                   Einträge in intin
  4473. contrl[6]        handle
  4474.  
  4475. Ausgaben:
  4476.  
  4477. contrl[2]        0                   Einträge in ptsout
  4478. contrl[4]        37                  Einträge in intout
  4479. intout[0..36]    cursor[0..36]       Mauszeigerdefinition
  4480.  
  4481.  
  4482. ∙ INQUIRE INPUT MODE (VDI 115)
  4483.  
  4484. Diese Funktion ermittelt den Eingabemodus eines Gerätes.
  4485.  
  4486. Dekl.:  void vqin_mode( WORD handle, WORD dev_type, WORD *input_mode );
  4487. Aufruf: vqin_mode( handle, dev_type, &input_mode );
  4488.  
  4489. Variable         Belegung            Bedeutung
  4490. Eingaben:
  4491.  
  4492. contrl[0]        115                 vqin_mode
  4493. contrl[1]        0                   Einträge in ptsin
  4494. contrl[3]        1                   Einträge in intin
  4495. contrl[6]        handle
  4496. intin[0]         dev_type            Gerätenummer (siehe vsin_mode)
  4497.  
  4498. Ausgaben:
  4499.  
  4500. contrl[2]        0                   Einträge in ptsout
  4501. contrl[4]        1                   Einträge in intout
  4502. intout[1]        input_mode          Eingabe-Modus
  4503.  
  4504.  
  4505. ∙ EXCHANGE TIMER INTERRUPT VECTOR (VDI 118)
  4506.  
  4507. Mit dieser Funktion kann man eine eigene Routine im Timerinterrupt (etv_timer)
  4508. aufrufen lassen. Diese Routine mu₧ an ihrem Ende alle veränderten Register
  4509. restaurieren und die alte Timerinterruptroutine anspringen.
  4510.  
  4511. Dekl.:  void vex_timv( WORD handle, void *tim_addr, void **otim_addr,
  4512.                        WORD *tim_conv );
  4513. Aufruf: vex_timv( handle, tim_addr, &otim_addr, &tim_conv );
  4514.  
  4515. Variable         Belegung            Bedeutung
  4516. Eingaben:
  4517.  
  4518. contrl[0]        118                 vex_timv
  4519. contrl[1]        0                   Einträge in ptsin
  4520. contrl[3]        0                   Einträge in intin
  4521. contrl[6]        handle
  4522. contrl[7..8]     tim_addr            Adresse der neuen Interruptroutine
  4523.  
  4524. Ausgaben:
  4525.  
  4526. contrl[2]        0                   Einträge in ptsout
  4527. contrl[4]        1                   Einträge in intout
  4528. contrl[9..10]    otim_addr           Adresse der alten Interruptroutine
  4529. intout[0]        tim_conv            Interruptintervall in ms
  4530.  
  4531.  
  4532. ∙ SHOW CURSOR (VDI 122)
  4533.  
  4534. Mit "SHOW CURSOR" wird ein vorhergehender "HIDE CURSOR"-Aufruf aufgehoben. Wenn
  4535. man den Mauszeiger sofort erscheinen lassen möchte, mu₧ der Parameter <reset>
  4536. Null sein.
  4537.  
  4538. Dekl.:  void v_show_c( WORD handle, WORD reset );
  4539. Aufruf: v_show_c( handle, reset );
  4540.  
  4541. Variable         Belegung            Bedeutung
  4542. Eingaben:
  4543.  
  4544. contrl[0]        122                 v_show_c
  4545. contrl[1]        0                   Einträge in ptsin
  4546. contrl[3]        1                   Einträge in intin
  4547. contrl[6]        handle
  4548. intin[0]         reset
  4549.  
  4550. Ausgaben:
  4551.  
  4552. contrl[2]        0                   Einträge in ptsout
  4553. contrl[4]        0                   Einträge in intout
  4554.  
  4555. Bedeutung von reset:
  4556. 0:    Mauszeiger sofort anzeigen
  4557. <> 0: Hide-Counter dekrementieren und gegebenenfalls Mauszeiger zeichnen
  4558.  
  4559. Bemerkung:
  4560. Zum  Ein-/Ausschalten der Maus sollte in GEM-Programmen unbedingt die
  4561. AES-Funktion graf_mouse() verwendet werden.
  4562.  
  4563.  
  4564. ∙ HIDE CURSOR (VDI 123)
  4565.  
  4566. Diese Funktion schaltet den Mauszeiger aus.
  4567.  
  4568. Dekl.:  void v_hide_c( WORD handle );
  4569. Aufruf: v_hide_c( handle );
  4570.  
  4571. Variable         Belegung            Bedeutung
  4572. Eingaben:
  4573.  
  4574. contrl[0]        123                 v_hide_c
  4575. contrl[1]        0                   Einträge in ptsin
  4576. contrl[3]        0                   Einträge in intin
  4577. contrl[6]        handle
  4578.  
  4579. Ausgaben:
  4580.  
  4581. contrl[2]        0                   Einträge in ptsout
  4582. contrl[4]        0                   Einträge in intout
  4583.  
  4584. Bemerkung:
  4585. Zum  Ein-/Ausschalten der Maus sollte in GEM-Programmen unbedingt die
  4586. AES-Funktion graf_mouse() verwendet werden.
  4587.  
  4588.  
  4589. ∙ SAMPLE MOUSE BUTTON STATE (VDI 124)
  4590.  
  4591. Diese Funktion gibt Informationen über die Mauszeiger-Position und den  Status
  4592. der Maustasten zurück.
  4593.  
  4594. Dekl.:  void vq_mouse( WORD handle, WORD *status, WORD *x, WORD *y );
  4595. Aufruf: vq_mouse( handle, &status, &x, &y );
  4596.  
  4597. Variable         Belegung            Bedeutung
  4598. Eingaben:
  4599.  
  4600. contrl[0]        124                 vq_mouse
  4601. contrl[1]        0                   Einträge in ptsin
  4602. contrl[3]        0                   Einträge in intin
  4603. contrl[6]        handle
  4604.  
  4605. Ausgaben:
  4606.  
  4607. contrl[2]        1                   Einträge in ptsout
  4608. contrl[4]        1                   Einträge in intout
  4609. intout[0]        status              Maustastenstatus
  4610. ptsout[0]        x
  4611. ptsout[1]        y
  4612.  
  4613. Bedeutung von status:
  4614. 0: keine Maustaste gedrückt
  4615. 1: linke Maustaste gedrückt
  4616. 2: rechte Maustaste gedrückt
  4617. 3: beide Maustasten gedrückt
  4618.  
  4619. Bemerkung:
  4620. In GEM-Programmen sollte die AES-Funktion graf_mkstate() verwendet werden, um
  4621. nur die für die eigene Applikation bestimmten Informationen über Position und
  4622. Status der Maustastenstatus zu erhalten.
  4623.  
  4624.  
  4625. ∙ EXCHANGE BUTTON CHANGE VECTOR (VDI 125)
  4626.  
  4627. Mit "EXCHANGE BUTTON CHANGE VECTOR" kann man eine Routine installieren, die beim
  4628. Druck einer Maustaste aufgerufen wird und in Register d0.w den Status der
  4629. Maustasten erthält. Diese Routine mu₧ alle veränderten Register wiederherstellen
  4630. und die alte Maustasten-Status-Routine aufrufen.
  4631.  
  4632. Dekl.:  void vex_butv( WORD handle, void *pusrcode, void **psavcode );
  4633. Aufruf: vex_butv( handle, pusrcode, &psavcode );
  4634.  
  4635. Variable         Belegung            Bedeutung
  4636. Eingaben:
  4637.  
  4638. contrl[0]        125                 vex_butv
  4639. contrl[1]        0                   Einträge in ptsin
  4640. contrl[3]        0                   Einträge in intin
  4641. contrl[6]        handle
  4642. contrl[7..8]     pusrcode            Adresse der neuen Routine
  4643.  
  4644. Ausgaben:
  4645.  
  4646. contrl[2]        0                   Einträge in ptsout
  4647. contrl[4]        0                   Einträge in intout
  4648. contrl[9..10]    psavcode            Adresse der alten Routine
  4649.  
  4650.  
  4651. ∙ EXCHANGE MOUSE MOVEMENT VECTOR (VDI 126)
  4652.  
  4653. Diese Funktion erlaubt im Fall von Mausbewegungen den Aufruf einer Anwender-
  4654. Routine, der in d0.w und d1.w die Koordinaten des Mauszeigers übergeben werden.
  4655. Alle veränderten Register müssen von dieser Routine restauriert werden.
  4656. Anschlie₧end sollte die alte Mausbewegungsroutine aufgerufen werden.
  4657.  
  4658. Dekl.:  void vex_motv( WORD handle, void *pusrcode, void **psavcode );
  4659. Aufruf: vex_motv( handle, pusrcode, &psavcode );
  4660.  
  4661. Variable         Belegung            Bedeutung
  4662. Eingaben:
  4663.  
  4664. contrl[0]        126                 vex_motv
  4665. contrl[1]        0                   Einträge in ptsin
  4666. contrl[3]        0                   Einträge in intin
  4667. contrl[6]        handle
  4668. contrl[7..8]     pusrcode            Adresse der neuen Routine
  4669.  
  4670. Ausgaben:
  4671.  
  4672. contrl[2]        0                   Einträge in ptsout
  4673. contrl[4]        0                   Einträge in intout
  4674. contrl[9..10]    psavcode            Adresse der alten Routine
  4675.  
  4676.  
  4677. ∙ EXCHANGE CURCOR CHANGE VECTOR (VDI 127)
  4678.  
  4679. Mit "EXCHANGE CURSOR CHANGE VECTOR" kann man eine Routine installieren, die bei
  4680. Mausbewegungen aufgerufen wird. Der Aufruf dieser Routine erfolgt, nachdem die
  4681. über vex_motv() eingetragene Routine aufgerufen und die Mauszeiger-Koordinaten,
  4682. die man in d0.w und d1.w erhält, geclippt wurden. Alle  veränderten  Register
  4683. müssen wiederhergestellt werden. Anschlie₧end sollte die alte Routine aufgerufen
  4684. werden.
  4685.  
  4686. Dekl.:  void vex_curv( WORD handle, void *pusrcode, void **psavcode );
  4687. Aufruf: vex_curv( handle, pusrcode, &psavcode );
  4688.  
  4689. Variable         Belegung            Bedeutung
  4690. Eingaben:
  4691.  
  4692. contrl[0]        127                 vex_curv
  4693. contrl[1]        0                   Einträge in ptsin
  4694. contrl[3]        0                   Einträge in intin
  4695. contrl[6]        handle
  4696. contrl[7..8]     pusrcode            Adresse der neuen Routine
  4697.  
  4698. Ausgaben:
  4699.  
  4700. contrl[2]        0                   Einträge in ptsout
  4701. contrl[4]        0                   Einträge in intout
  4702. contrl[9..10]    psavcode            Adresse der alten Routine
  4703.  
  4704.  
  4705. ∙ SAMPLE KEYBOARD STATE INFORMATION (VDI 128)
  4706.  
  4707. Diese Funktion gibt den Status der CONTROL-, ALTERNATE- sowie der SHIFT-
  4708. Taste(n) zurück.
  4709.  
  4710. Dekl.:  void vq_key_s( WORD handle, WORD *status );
  4711. Aufruf: vq_key_s( handle, &status );
  4712.  
  4713. Variable         Belegung            Bedeutung
  4714. Eingaben:
  4715.  
  4716. contrl[0]        128                 vq_key_s
  4717. contrl[1]        0                   Einträge in ptsin
  4718. contrl[3]        0                   Einträge in intin
  4719. contrl[6]        handle
  4720.  
  4721. Ausgaben:
  4722.  
  4723. contrl[2]        0                   Einträge in ptsout
  4724. contrl[4]        1                   Einträge in intout
  4725. intout[0]        pstatus             Tastenstatus
  4726.  
  4727. Bedeutung von pstatus (Bitnummer):
  4728. 0: rechte Shift-Taste
  4729. 1: linke Shift-Taste
  4730. 2: Control-Taste
  4731. 3: Alternate-Taste
  4732.  
  4733. Bemerkung:
  4734. In GEM-Programmen sollten die AES Event-Funktionen verwendet werden, um nur die
  4735. für die eigene Applikation bestimmten Informationen über den Tastaturstatus zu
  4736. erhalten.
  4737.  
  4738.  
  4739.  
  4740.  
  4741. Textmodus und VT52
  4742. ==================
  4743.  
  4744. ∙ INQUIRE ADDRESSABLE ALPHA CHARACTER CELLS (VDI 5, ESCAPE 1)
  4745.  
  4746. Diese Funktion gibt über die Anzahl der Zeilen und Spalten des Textbildschirmes
  4747. Auskunft. Wenn <rows> und <colums> 0 sind, gibt es auf dem Gerät keinen
  4748. Textmodus.
  4749.  
  4750. Dekl.:  void vq_chcells( WORD handle, WORD *rows, WORD *columns );
  4751. Aufruf: vq_chcells( handle, &rows, &columns );
  4752.  
  4753. Variable         Belegung            Bedeutung
  4754. Eingaben:
  4755.  
  4756. contrl[0]        5                   ESCAPE
  4757. contrl[1]        0                   Einträge in ptsin
  4758. contrl[3]        0                   Einträge in intin
  4759. contrl[5]        1                   vq_chcells
  4760. contrl[6]        handle
  4761.  
  4762. Ausgaben:
  4763.  
  4764. contrl[2]        0                   Einträge in ptsout
  4765. contrl[4]        2                   Einträge in intout
  4766. intout[0]        rows                Zeilenanzahl
  4767. intout[1]        columns             Spaltenanzahl
  4768.  
  4769.  
  4770. ∙ EXIT ALPHA MODE (VDI 5, ESCAPE 2)
  4771.  
  4772. "EXIT ALPHA MODE" schaltet den Textmodus aus.
  4773.  
  4774. Dekl.:  void v_exit_cur( WORD handle );
  4775. Aufruf: v_exit_cur( handle );
  4776.  
  4777. Variable         Belegung            Bedeutung
  4778. Eingaben:
  4779.  
  4780. contrl[0]        5                   ESCAPE
  4781. contrl[1]        0                   Einträge in ptsin
  4782. contrl[3]        0                   Einträge in intin
  4783. contrl[5]        2                   v_exit_cur
  4784. contrl[6]        handle
  4785.  
  4786. Ausgaben:
  4787.  
  4788. contrl[2]        0                   Einträge in ptsout
  4789. contrl[4]        0                   Einträge in intout
  4790.  
  4791.  
  4792. ∙ ENTER ALPHA MODE (VDI 5, ESCAPE 3)
  4793.  
  4794. Mit dieser Funktion gelangt man in den Textmodus. Der Bildschirm wird gelöscht
  4795. und der Text-Cursor in die linke obere Ecke gesetzt.
  4796.  
  4797. Dekl.:  void v_enter_cur( WORD handle );
  4798. Aufruf: v_enter_cur( handle );
  4799.  
  4800. Variable         Belegung            Bedeutung
  4801. Eingaben:
  4802.  
  4803. contrl[0]        5                   ESCAPE
  4804. contrl[1]        0                   Einträge in ptsin
  4805. contrl[3]        0                   Einträge in intin
  4806. contrl[5]        3                   v_enter_cur
  4807. contrl[6]        handle
  4808.  
  4809. Ausgaben:
  4810.  
  4811. contrl[2]        0                   Einträge in ptsout
  4812. contrl[4]        0                   Einträge in intout
  4813.  
  4814.  
  4815. ∙ ALPHA CURSOR UP (VDI 5, ESCAPE 4)
  4816.  
  4817. Der Text-Cursor wird von dieser Funktion eine Zeile nach oben bewegt. Sofern er
  4818. sich in der obersten Zeile befindet, geschieht nichts.
  4819.  
  4820. Dekl.:  void v_curup( WORD handle );
  4821. Aufruf: v_curup( handle );
  4822.  
  4823. Variable         Belegung            Bedeutung
  4824. Eingaben:
  4825.  
  4826. contrl[0]        5                   ESCAPE
  4827. contrl[1]        0                   Einträge in ptsin
  4828. contrl[3]        0                   Einträge in intin
  4829. contrl[5]        4                   v_curup
  4830. contrl[6]        handle
  4831.  
  4832. Ausgaben:
  4833.  
  4834. contrl[2]        0                   Einträge in ptsout
  4835. contrl[4]        0                   Einträge in intout
  4836.  
  4837.  
  4838. ∙ ALPHA CURSOR DOWN (VDI 5, ESCAPE 5)
  4839.  
  4840. Der Text-Cursor wird um eine Zeile nach unten bewegt. Befindet sich der Cursor
  4841. in der untersten Zeile, so passiert nichts.
  4842.  
  4843. Dekl.:  void v_curdown( WORD handle );
  4844. Aufruf: v_curdown( handle );
  4845.  
  4846. Variable         Belegung            Bedeutung
  4847. Eingaben:
  4848.  
  4849. contrl[0]        5                   ESCAPE
  4850. contrl[1]        0                   Einträge in ptsin
  4851. contrl[3]        0                   Einträge in intin
  4852. contrl[5]        5                   v_curdown
  4853. contrl[6]        handle
  4854.  
  4855. Ausgaben:
  4856.  
  4857. contrl[2]        0                   Einträge in ptsout
  4858. contrl[4]        0                   Einträge in intout
  4859.  
  4860.  
  4861. ∙ ALPHA CURSOR RIGHT (VDI 5, ESCAPE 6)
  4862.  
  4863. "ALPHA CURSOR RIGHT" bewegt den Text-Cursor nach rechts, wobei am Zeilenende
  4864. nichts geschieht.
  4865.  
  4866. Dekl.:  void v_curright( WORD handle );
  4867. Aufruf: v_curright( handle );
  4868.  
  4869. Variable         Belegung            Bedeutung
  4870. Eingaben:
  4871.  
  4872. contrl[0]        5                   ESCAPE
  4873. contrl[1]        0                   Einträge in ptsin
  4874. contrl[3]        0                   Einträge in intin
  4875. contrl[5]        6                   v_curright
  4876. contrl[6]        handle
  4877.  
  4878. Ausgaben:
  4879.  
  4880. contrl[2]        0                   Einträge in ptsout
  4881. contrl[4]        0                   Einträge in intout
  4882.  
  4883.  
  4884. ∙ ALPHA CURSOR LEFT (VDI 5, ESCAPE 7)
  4885.  
  4886. Der Text-Cursor wird von dieser Funktion nach links bewegt. Es passiert nichts,
  4887. wenn er sich bereits am Zeilenanfang befinden sollte.
  4888.  
  4889. Dekl.:  void v_curleft( WORD handle );
  4890. Aufruf: v_curleft( handle );
  4891.  
  4892. Variable         Belegung            Bedeutung
  4893. Eingaben:
  4894.  
  4895. contrl[0]        5                   ESCAPE
  4896. contrl[1]        0                   Einträge in ptsin
  4897. contrl[3]        0                   Einträge in intin
  4898. contrl[5]        7                   v_curleft
  4899. contrl[6]        handle
  4900.  
  4901. Ausgaben:
  4902.  
  4903. contrl[2]        0                   Einträge in ptsout
  4904. contrl[4]        0                   Einträge in intout
  4905.  
  4906.  
  4907. ∙ HOME ALPHA CURSOR (VDI 5, ESCAPE 8)
  4908.  
  4909. Von dieser Funktion wird der Text-Cursor in die linke obere Ecke gesetzt.
  4910.  
  4911. Dekl.:  void v_curhome( WORD handle );
  4912. Aufruf: v_curhome( handle );
  4913.  
  4914. Variable         Belegung            Bedeutung
  4915. Eingaben:
  4916.  
  4917. contrl[0]        5                   ESCAPE
  4918. contrl[1]        0                   Einträge in ptsin
  4919. contrl[3]        0                   Einträge in intin
  4920. contrl[5]        8                   v_curhome
  4921. contrl[6]        handle
  4922.  
  4923. Ausgaben:
  4924.  
  4925. contrl[2]        0                   Einträge in ptsout
  4926. contrl[4]        0                   Einträge in intout
  4927.  
  4928.  
  4929. ∙ ERASE TO END OF ALPHA SRCEEN (VDI 5, ESCAPE 9)
  4930.  
  4931. Der Bildschirm wird von der aktuellen Cursor-Position ab gelöscht.
  4932.  
  4933. Dekl.:  void v_eeos( WORD handle );
  4934. Aufruf: v_eeos( handle );
  4935.  
  4936. Variable         Belegung            Bedeutung
  4937. Eingaben:
  4938.  
  4939. contrl[0]        5                   ESCAPE
  4940. contrl[1]        0                   Einträge in ptsin
  4941. contrl[3]        0                   Einträge in intin
  4942. contrl[5]        9                   v_eeos
  4943. contrl[6]        handle
  4944.  
  4945. Ausgaben:
  4946.  
  4947. contrl[2]        0                   Einträge in ptsout
  4948. contrl[4]        0                   Einträge in intout
  4949.  
  4950.  
  4951. ∙ ERASE TO END OF ALPHA TEXT LINE (VDI 5, ESCAPE 10)
  4952.  
  4953. Diese Funktion löscht ab der Cursor-Position die aktuelle Zeile.
  4954.  
  4955. Dekl.:  void v_eeol( WORD handle );
  4956. Aufruf: v_eeol( handle );
  4957.  
  4958. Variable         Belegung            Bedeutung
  4959. Eingaben:
  4960.  
  4961. contrl[0]        5                   ESCAPE
  4962. contrl[1]        0                   Einträge in ptsin
  4963. contrl[3]        0                   Einträge in intin
  4964. contrl[5]        10                  v_eeol
  4965. contrl[6]        handle
  4966.  
  4967. Ausgaben:
  4968.  
  4969. contrl[2]        0                   Einträge in ptsout
  4970. contrl[4]        0                   Einträge in intout
  4971.  
  4972.  
  4973. ∙ DIRECT ALPHA CURSOR ADDRESS (VDI 5, ESCAPE 11)
  4974.  
  4975. Mit "DIRECT ALPHA CURSOR ADDRESS" kann der Text-Cursor direkt positioniert
  4976. werden.
  4977.  
  4978. Dekl.:  void v_curaddress( WORD handle, WORD row, WORD column );
  4979. Aufruf: v_curadress( handle, row, column );
  4980.  
  4981. Variable         Belegung            Bedeutung
  4982. Eingaben:
  4983.  
  4984. contrl[0]        5                   ESCAPE
  4985. contrl[1]        0                   Einträge in ptsin
  4986. contrl[3]        2                   Einträge in intin
  4987. contrl[5]        11                  v_curaddress
  4988. contrl[6]        handle
  4989. intin[0]         row                 Zeile
  4990. intin[1]         column              Spalte
  4991.  
  4992. Ausgaben:
  4993.  
  4994. contrl[2]        0                   Einträge in ptsout
  4995. contrl[4]        0                   Einträge in intout
  4996.  
  4997.  
  4998. ∙ OUTPUT CURSOR ADDRESSABLE ALPHA TEXT (VDI 5, ESCAPE 12)
  4999.  
  5000. Diese Funktion gibt an der aktuellen Cursor-Position eine Zeichenkette aus.
  5001.  
  5002. Dekl.:  void v_curtext( WORD handle, BYTE *string );
  5003. Aufruf: v_curtext( handle, string );
  5004.  
  5005. Variable         Belegung            Bedeutung
  5006. Eingaben:
  5007.  
  5008. contrl[0]        5                   ESCAPE
  5009. contrl[1]        0                   Einträge in ptsin
  5010. contrl[3]        n                   Einträge in intin
  5011. contrl[5]        12                  v_curtext
  5012. contrl[6]        handle
  5013. intin[0..n-1]    string[0..n-1]      Zeichenkette
  5014.  
  5015. Ausgaben:
  5016.  
  5017. contrl[2]        0                   Einträge in ptsout
  5018. contrl[4]        0                   Einträge in intout
  5019.  
  5020.  
  5021. ∙ REVERSE VIDEO ON (VDI 5, ESCAPE 13)
  5022.  
  5023. Diese Funktion schaltet auf inverse Textausgabe um.
  5024.  
  5025. Dekl.:  void v_rvon( WORD handle );
  5026. Aufruf: v_rvon( handle );
  5027.  
  5028. Variable         Belegung            Bedeutung
  5029. Eingaben:
  5030.  
  5031. contrl[0]        5                   ESCAPE
  5032. contrl[1]        0                   Einträge in ptsin
  5033. contrl[3]        0                   Einträge in intin
  5034. contrl[5]        13                  v_rvon
  5035. contrl[6]        handle
  5036.  
  5037. Ausgaben:
  5038.  
  5039. contrl[2]        0                   Einträge in ptsout
  5040. contrl[4]        0                   Einträge in intout
  5041.  
  5042.  
  5043. ∙ REVERSE VIDEO OFF (VDI 5, ESCAPE 14)
  5044.  
  5045. Die inverse Textausgabe wird ausgeschaltet.
  5046.  
  5047. Dekl.:  void v_rvoff( WORD handle );
  5048. Aufruf: v_rvoff( handle );
  5049.  
  5050. Variable         Belegung            Bedeutung
  5051. Eingaben:
  5052.  
  5053. contrl[0]        5                   ESCAPE
  5054. contrl[1]        0                   Einträge in ptsin
  5055. contrl[3]        0                   Einträge in intin
  5056. contrl[5]        14                  v_rvoff
  5057. contrl[6]        handle
  5058.  
  5059. Ausgaben:
  5060.  
  5061. contrl[2]        0                   Einträge in ptsout
  5062. contrl[4]        0                   Einträge in intout
  5063.  
  5064.  
  5065. ∙ INQUIRE CURRENT ALPHA CURCOR ADDRESS (VDI 5, ESCAPE 15)
  5066.  
  5067. Von dieser Funktion wird die Position des Text-Cursors zurückgegeben.
  5068.  
  5069. Dekl.:  void vq_curaddress( WORD handle, WORD *row, WORD *column );
  5070. Aufruf: vq_curaddress( handle, &row, &column );
  5071.  
  5072. Variable         Belegung            Bedeutung
  5073. Eingaben:
  5074.  
  5075. contrl[0]        5                   ESCAPE
  5076. contrl[1]        0                   Einträge in ptsin
  5077. contrl[3]        0                   Einträge in intin
  5078. contrl[5]        15                  vq_curaddress
  5079. contrl[6]        handle
  5080.  
  5081. Augaben:
  5082.  
  5083. contrl[2]        0                   Einträge in ptsout
  5084. contrl[4]        2                   Einträge in intout
  5085. intout[0]        row                 Zeile
  5086. intout[1]        column              Spalte
  5087.  
  5088.  
  5089.  
  5090.  
  5091. Beispiele für Bindings
  5092. ======================
  5093.  
  5094. Diese Beispiel-Bindings gehen davon aus, da₧ <pb>, <contrl>, <intin>, <ptsin>,
  5095. <intout> und <ptsout> global definiert sind. Die Funktion vdi() ist als
  5096. void vdi( VDIPB *pb ) definiert. WORD, UWORD usw. sind normalerweise in PORTAB.H
  5097. definiert, fix31 sollte als LONG definiert werden.
  5098.  
  5099. /* Strukturdefinitionen */
  5100.  
  5101. typedef struct
  5102. {
  5103.    void  *fd_addr;         /* Adresse des Rasters oder 0 für Bildschirm/Bitmap */
  5104.    WORD  fd_w;             /* Breite des Rasters in Pixeln */
  5105.    WORD  fd_h;             /* Höhe des Rasters in Zeilen */
  5106.    WORD  fd_wdwidth;       /* Breite einer Rasterzeile in Worten */
  5107.    WORD  fd_stand;         /* Format 0: gerätespezifisch, 1: Standardformat */
  5108.    WORD  fd_nplanes;       /* Anzahl der Ebenen */
  5109.    WORD  fd_r1;            /* reserviert, sollte 0 sein */
  5110.    WORD  fd_r2;            /* reserviert, sollte 0 sein */
  5111.    WORD  fd_r3;            /* reserviert, sollte 0 sein */
  5112. } MFDB;
  5113.  
  5114. typedef struct
  5115. {
  5116.    WORD  red;              /* Rot-Intensität in Promille (0-1000) */
  5117.    WORD  green;            /* Grün-Intensität in Promille (0-1000) */
  5118.    WORD  blue;             /* Blau-Intensität in Promille (0-1000) */
  5119. } RGB1000;
  5120.  
  5121. typedef struct
  5122. {
  5123.    LONG  size;             /* Länge der Struktur, mu₧ vor vqt_xfntinfo() gesetzt werden */
  5124.    WORD  format;           /* Fontformat, z.B. 4 für TrueType */
  5125.    WORD  id;               /* Font-ID, z.B. 6059 */
  5126.    WORD  index;            /* Index */
  5127.    BYTE  font_name[50];    /* vollständiger Fontname, z.B. "Century 725 Italic BT" */
  5128.    BYTE  family_name[50];  /* Name der Fontfamilie, z.B. "Century725 BT" */
  5129.    BYTE  style_name[50];   /* Name des Fontstils, z.B. "Italic" */
  5130.    BYTE  file_name1[200];  /* Name der 1. Fontdatei, z.B. "C:\FONTS\TT1059M_.TTF" */
  5131.    BYTE  file_name2[200];  /* Name der optionalen 2. Fontdatei */
  5132.    BYTE  file_name3[200];  /* Name der optionalen 3. Fontdatei */
  5133.    WORD  pt_cnt;           /* Anzahl der Punkthöhen für vst_point(), z.B. 10 */
  5134.    WORD  pt_sizes[64];     /* verfügbare Punkthöhen,
  5135.                               z.B. { 8, 9, 10, 11, 12, 14, 18, 24, 36, 48 } */
  5136. } XFNT_INFO;
  5137.  
  5138. /* Funktionsprototypen */
  5139. void  vdi_str_to_c( UWORD *src, UBYTE *des, WORD len );
  5140. WORD  c_str_to_vdi( UBYTE *src, UWORD *des );
  5141. WORD  fix31_to_pixel( fix31 a );
  5142. void  vs_color( WORD handle, WORD index, RGB1000 *rgb_in );
  5143. WORD  vq_color( WORD handle, WORD color_index, WORD flag, RGB1000 *rgb_out );
  5144. WORD  vs_calibrate( WORD handle, WORD flag, RGB1000 *table );
  5145. WORD  vq_calibrate( WORD handle, WORD *flag );
  5146. void  v_opnbm( WORD *work_in, MFDB *bitmap, WORD *handle, WORD *work_out );
  5147. void  v_clsbm( WORD handle );
  5148. void  vq_scrninfo( WORD handle, WORD *work_out );
  5149. WORD  vq_devinfo2( WORD handle, WORD device, WORD *dev_exists, BYTE *file_name, BYTE *real_name );
  5150. WORD  vq_ext_devinfo( WORD handle, WORD device, WORD *dev_exists,
  5151.                       BYTE *file_path, BYTE *file_name, BYTE *name );
  5152. WORD  vqt_name( WORD handle, WORD index, BYTE *name, UWORD *font_format, UWORD *flags );
  5153. void  vst_width( WORD handle, WORD width, WORD *char_width, WORD *char_height,
  5154.                  WORD *cell_width, WORD *cell_height );
  5155. void  vst_track_offset( WORD handle, fix31 offset, WORD pair_mode, WORD *tracks, WORD *pairs );
  5156. void  vqt_real_extent( WORD handle, WORD x, WORD y, BYTE *string, WORD *extent );
  5157. WORD  vqt_xfntinfo( WORD handle, WORD flags, WORD id, WORD index, XFNT_INFO *info );
  5158. WORD vst_name( WORD handle, WORD font_format, BYTE *font_name, BYTE *ret_name );
  5159. WORD  vqt_name_and_id( WORD handle, WORD font_format, BYTE *font_name, BYTE *ret_name );
  5160.  
  5161. /* VDI-String in einen C-String umwandeln */
  5162. void  vdi_str_to_c( UWORD *src, UBYTE *des, WORD len )
  5163. {
  5164.    while ( len > 0 )
  5165.    {
  5166.       *des++ = (UBYTE) *src++;   /* nur das Low-Byte kopieren */
  5167.       len--;
  5168.    }
  5169.    *des++ = 0;                   /* Ende des Strings */
  5170. }
  5171.  
  5172. /* C-String in einen VDI-String umwandeln */
  5173. WORD  c_str_to_vdi( UBYTE *src, UWORD *des )
  5174. {
  5175.    WORD  len;
  5176.  
  5177.    while (( *des++ = *src++ ) != 0 )
  5178.       len++;
  5179.  
  5180.    return( len );                /* Länge des Strings ohne Null-Byte */
  5181. }
  5182.  
  5183. /* Positionsangabe in fix31-Darstellung in Pixel-Koordinate umrechnen */
  5184. WORD  fix31_to_pixel( fix31 a )
  5185. {
  5186.    WORD  b;
  5187.  
  5188.    b = (WORD) (( a + 32768L ) >> 16 ); /* runden !! */
  5189.    return( b );                        /* Pixelwert zurückgeben */
  5190. }
  5191.  
  5192. void  vs_color( WORD handle, WORD index, RGB1000 *rgb_in )
  5193. {
  5194.    intin[0] = index;
  5195.    intin[1] = rgb_in->red;
  5196.    intin[2] = rgb_in->green;
  5197.    intin[3] = rgb_in->blue;
  5198.  
  5199.    contrl[0] = 14;
  5200.    contrl[1] = 0;
  5201.    contrl[3] = 4;
  5202.    contrl[5] = 0;
  5203.    contrl[6] = handle;
  5204.  
  5205.    vdi( &pb );
  5206. }
  5207.  
  5208. WORD  vq_color( WORD handle, WORD color_index, WORD flag, RGB1000 *rgb_out )
  5209. {
  5210.    intin[0] = color_index;
  5211.    intin[1] = flag;
  5212.  
  5213.    contrl[0] = 26;
  5214.    contrl[1] = 0;
  5215.    contrl[3] = 2;
  5216.    contrl[5] = 0;
  5217.    contrl[6] = handle;
  5218.  
  5219.    vdi( &pb );
  5220.  
  5221.    *rgb_out = *(RGB1000 *) (intout + 1);
  5222.    return( intout[0] );
  5223. }
  5224.  
  5225. WORD  vs_calibrate( WORD handle, WORD flag, RGB1000 *table )
  5226. {
  5227.    *(RGB1000 **)intin = table;
  5228.    intin[2] = flag;
  5229.  
  5230.    contrl[0] = 5;
  5231.    contrl[1] = 0;
  5232.    contrl[3] = 3;
  5233.    contrl[5] = 76;
  5234.    contrl[6] = handle;
  5235.  
  5236.    vdi( &pb );
  5237.  
  5238.    return( intout[0] );
  5239. }
  5240.  
  5241. WORD  vq_calibrate( WORD handle, WORD *flag )
  5242. {
  5243.    contrl[0] = 5;
  5244.    contrl[1] = 0;
  5245.    contrl[3] = 0;
  5246.    contrl[5] = 77;
  5247.    contrl[6] = handle;
  5248.  
  5249.    vdi( &pb );
  5250.  
  5251.    if ( contrl[4] > 0 )
  5252.    {
  5253.       *flag = intout[0];
  5254.       return( 1 );
  5255.    }
  5256.    else
  5257.    {
  5258.       *flag = 0
  5259.       return( 0 );
  5260.    }
  5261. }
  5262.  
  5263. void  v_opnbm( WORD *work_in, MFDB *bitmap, WORD *handle, WORD *work_out )
  5264. {
  5265.    /* Wenn work_in[15..19] 0 enthalten, wird eine Bitmap im gerätespezifischen
  5266.       Format oder mit nur 1 Ebene erzeugt (hängt vom MFDB ab). Anderfalls wird
  5267.       versucht eine Bitmap mit der Farbanzahl <work_in[15..16]>, <work_in[17]>
  5268.       Ebenen, dem Pixelformat <work_in[18]> und der Bitreihenfolge <work_in[19]>
  5269.       anzulegen. Falls kein passender Offscreen-Treiber vorhanden ist, kann die
  5270.       Bitmap nicht geöffnet werden.
  5271.    */
  5272.  
  5273.    pb[1] = work_in;
  5274.    pb[3] = work_out;
  5275.    pb[4] = work_out + 45;
  5276.  
  5277.    contrl[0] = 100;
  5278.    contrl[1] = 0;
  5279.    contrl[3] = 20;
  5280.    contrl[5] = 1;
  5281.    *(MFDB *)&contrl[7] = bitmap;
  5282.  
  5283.    vdi( &pb );
  5284.  
  5285.    *handle = contrl[6];
  5286.    pb[1] = intin;
  5287.    pb[3] = intout;
  5288.    pb[4] = ptsout;
  5289. }
  5290.  
  5291. void  v_clsbm( WORD handle )
  5292. {
  5293.    contrl[0] = 101;
  5294.    contrl[1] = 0;
  5295.    contrl[3] = 0;
  5296.    contrl[5] = 1;
  5297.    contrl[6] = handle;
  5298.    vdi( &pb );
  5299. }
  5300.  
  5301. void  vq_scrninfo( WORD handle, WORD *work_out )
  5302. {
  5303.    pb[3] = work_out;
  5304.  
  5305.    intin[0] = 2;
  5306.    contrl[0] = 102;
  5307.    contrl[1] = 0;
  5308.    contrl[3] = 1;
  5309.    contrl[5] = 1;
  5310.    contrl[6] = handle;
  5311.  
  5312.    vdi( &pb );
  5313.  
  5314.    pb[3] = intout;
  5315. }
  5316.  
  5317. WORD  vq_devinfo2( WORD handle, WORD device, WORD *dev_exists, BYTE *file_name, BYTE *real_name )
  5318. {
  5319.    contrl[0] = 248;                 /* Funktionsnummer */
  5320.    contrl[1] = 0;
  5321.    contrl[3] = 1;                   /* ID wird übergeben */
  5322.    contrl[5] = 0;
  5323.    contrl[6] = handle;
  5324.    intin[0] = device;               /* Gerät */
  5325.  
  5326.    vdi( &pb );
  5327.  
  5328.    *dev_exists = 0;                 /* Treiber ist nicht vorhanden */
  5329.    *file_name = 0;
  5330.    *real_name = 0;
  5331.  
  5332.    if ( contrl[4] && intout[0] )    /* Treiber vorhanden? */
  5333.    {
  5334.       WORD  i;
  5335.       WORD  len;
  5336.  
  5337.       *dev_exists = 1;              /* Treiber ist vorhanden */
  5338.  
  5339.       for ( i = 0; i < contrl[4]; i++ )
  5340.       {
  5341.          *file_name = (BYTE) intout[i];
  5342.          if ( *file_name == ' ' )    /* Trennung durch Leerzeichen? */
  5343.          {
  5344.             /* letztes Leerzeichen? */
  5345.             if (( i < contrl[4] ) && ( intout[i+1] != ' ' ))
  5346.             {
  5347.                *file_name = '.';    /* Leerzeichen ersetzen */
  5348.                file_name++;
  5349.             }
  5350.          }
  5351.          else
  5352.             file_name++;
  5353.       }
  5354.       *file_name++ = 0;             /* Endeeeee */
  5355.  
  5356.       if (( contrl[2] == 1 ) && ( contrl[1] > 0 )) /* !?+*~"▌)%&#/(^= */
  5357.          len = contrl[1];
  5358.       else
  5359.          len = contrl[2] - 1;
  5360.  
  5361.       for ( i = 1; i <= len; i++ )  /* Klartextnamen kopieren */
  5362.          *((WORD *)real_name)++ = ptsout[i];
  5363.       *real_name++ = 0;             /* sicherheitshalber */
  5364.    }
  5365.  
  5366.    return( ptsout[0] );             /* Treiber geöffnet oder nicht */
  5367. }
  5368.  
  5369. WORD  vq_ext_devinfo( WORD handle, WORD device, WORD *dev_exists,
  5370.                       BYTE *file_path, BYTE *file_name, BYTE *name )
  5371. {
  5372.    intin[0] = device;
  5373.    *(BYTE **)&intin[1] = file_path;
  5374.    *(BYTE **)&intin[3] = file_name;
  5375.    *(BYTE **)&intin[5] = name;
  5376.  
  5377.    contrl[0] = 248;
  5378.    contrl[1] = 0;
  5379.    contrl[3] = 7;
  5380.    contrl[5] = 4242;
  5381.    contrl[6] = handle;
  5382.  
  5383.    vdi( &pb );
  5384.  
  5385.    *dev_exists = intout[0];
  5386.    return( intout[1] );
  5387. }
  5388.  
  5389. WORD  vqt_name( WORD handle, WORD index, BYTE *name, UWORD *font_format, UWORD *flags )
  5390. {
  5391.    intin[0] = index;
  5392.    intin[1] = 0;
  5393.  
  5394.    contrl[0] = 130;
  5395.    contrl[1] = 0;
  5396.    contrl[3] = 2;
  5397.    contrl[5] = 1;
  5398.    contrl[6] = handle;
  5399.  
  5400.    vdi( &pb );
  5401.  
  5402.    vdi_str_to_c( (UWORD *)&intout[1], (UBYTE *) name, 31 );
  5403.  
  5404.    if ( contrl[4] <= 34 )
  5405.    {
  5406.       *flags = 0;
  5407.       *font_format = 0;
  5408.       if ( contrl[4] == 33 )
  5409.          name[32] = 0;
  5410.       else
  5411.          name[32] = (BYTE) intout[33];
  5412.    }
  5413.    else
  5414.    {
  5415.       name[32] = intout[33];
  5416.       *flags = (intout[34] >> 8) & 0xff;
  5417.       *font_format = intout[34] & 0xff;
  5418.    }
  5419.  
  5420.    return( intout[0] );
  5421. }
  5422.  
  5423. void  vst_width( WORD handle, WORD width, WORD *char_width, WORD *char_height,
  5424.                  WORD *cell_width, WORD *cell_height );
  5425. {
  5426.    ptsin[0] = width;
  5427.  
  5428.    contrl[0] = 231;
  5429.    contrl[1] = 1;
  5430.    contrl[3] = 0;
  5431.    contrl[5] = 0;
  5432.    contrl[6] = handle;
  5433.  
  5434.    vdi( &pb );
  5435.  
  5436.    *char_width = ptsout[0];
  5437.    *char_height = ptsout[1];
  5438.    *cell_width = ptsout[2];
  5439.    *cell_height = ptsout[3];
  5440. }
  5441.  
  5442. void  vst_track_offset( WORD handle, fix31 offset, WORD pair_mode, WORD *tracks, WORD *pairs )
  5443. {
  5444.    contrl[0] = 237;
  5445.    contrl[1] = 0;
  5446.    contrl[3] = 4;
  5447.    contrl[6] = handle;
  5448.  
  5449.    intin[0] = 255;
  5450.    intin[1] = pair_mode;
  5451.    *(fix31 *)&intin[2] = offset;
  5452.  
  5453.    vdi( &pb );
  5454.  
  5455.    *tracks = intout[0];
  5456.    *pairs = intout[1];
  5457. }
  5458.  
  5459. void  vqt_real_extent( WORD handle, WORD x, WORD y, BYTE *string, WORD *extent )
  5460. {
  5461.    WORD  len;
  5462.    WORD  i;
  5463.  
  5464.    ptsin[0] = x;
  5465.    ptsin[1] = y;
  5466.  
  5467.    len = c_str_to_vdi( (UBYTE *) string, (UWORD *) intin );
  5468.  
  5469.    contrl[0] = 240;
  5470.    contrl[1] = 1;
  5471.    contrl[3] = len;
  5472.    contrl[5] = 4200;
  5473.    contrl[6] = handle;
  5474.  
  5475.    vdi( &pb );
  5476.  
  5477.    for ( i = 0; i < 8; i++ )
  5478.       *extent++ = ptsout[i];
  5479. }
  5480.  
  5481. WORD  vqt_xfntinfo( WORD handle, WORD flags, WORD id, WORD index, XFNT_INFO *info )
  5482. {
  5483.    info->size = (LONG) sizeof( XFNT_INFO );
  5484.  
  5485.    intin[0] = flag;
  5486.    intin[1] = id;
  5487.    intin[2] = index;
  5488.    *(XFNT_INFO **)&intin[3] = info;
  5489.  
  5490.    contrl[0] = 229;
  5491.    contrl[1] = 0;
  5492.    contrl[3] = 5;
  5493.    contrl[5] = 0;
  5494.    contrl[6] = handle;
  5495.  
  5496.    vdi( &pb );
  5497.  
  5498.    return( intout[1] );
  5499. }
  5500.  
  5501. WORD  vst_name( WORD handle, WORD font_format, BYTE *font_name, BYTE *ret_name )
  5502. {
  5503.    WORD  len;
  5504.  
  5505.    intin[0] = font_format;
  5506.    len = c_str_to_vdi( (UBYTE *) font_name, (UWORD *)&intin[1] );
  5507.  
  5508.    contrl[0] = 230;
  5509.    contrl[1] = 0;
  5510.    contrl[3] = 1 + len;
  5511.    contrl[5] = 0;
  5512.    contrl[6] = handle;
  5513.  
  5514.    vdi( &pb );
  5515.  
  5516.    if ( ret_name )
  5517.       vdi_str_to_c( (UWORD *)&intout[1], ret_name, contrl[4] );
  5518.  
  5519.    return( intout[0] );
  5520. }
  5521.  
  5522. WORD  vqt_name_and_id( WORD handle, WORD font_format, BYTE *font_name, BYTE *ret_name )
  5523. {
  5524.    WORD  len;
  5525.  
  5526.    intin[0] = font_format;
  5527.    len = c_str_to_vdi( (UBYTE *) font_name, (UWORD *) intin + 1 );
  5528.  
  5529.    contrl[0] = 230;
  5530.    contrl[1] = 0;
  5531.    contrl[3] = 1 + len;
  5532.    contrl[5] = 100;
  5533.    contrl[6] = handle;
  5534.  
  5535.    vdi( &pb );
  5536.  
  5537.    if ( ret_name )
  5538.       vdi_str_to_c( (UWORD *)&intout[1], ret_name, contrl[4] );
  5539.  
  5540.    return( intout[0] );
  5541. }
  5542.  
  5543.  
  5544.